2015-12-02 72 views
2

据我了解,雨燕的map功能执行以下操作:斯威夫特的映射函数

  • 在任何采用SequenceType
  • 想法是返回另一个“东西”工程(寻找一个更好的词),其有它是通过你传递到封闭的逻辑转化元素
  • 始终返回“东西”仍然符合SequenceType和元素#不改变

例如:

我们有2类牛奶奶酪。我们给出的构造函数奶酪,这是这样的:

init(withMilk milk: Milk) { 
    self.milk = milk 
} 

鉴于牛奶对象的数组,我们把奶阵列对象为奶酪对象,像这样:

let arrayOfCheese = arrayOfMilk.map { Cheese(withMilk: $0) } 

这对我来说很好。但现在我想要比普通奶酪更多的东西。我需要的成分来自全国各地的地方:

let arrayOfSuperCheese = arrayOfMilk.map { 
    let cheese = Cheese(usingMilk: $0) 
    let sulfur = Sulfur() 
    let minerals = Minerals() 
    let mixer = Mixer() 

    let superCheese = mixer.mixIn(sulphur: sulphur, minerals: minerals) 
    return superCheese 
} 

编译器告诉我:

Cannot invoke 'map' with an argument list of type '(@noescape (Element) throws -> _)

上面的例子大致是我目前遇到的问题。请让我知道这个例子是否有意义。

+0

你的代码示例使用'withMilk',但用法使用'usingMilk'。你确定你的代码没有错字吗? –

+0

固定,对不起。我实际上没有这样的代码,只是把它放在了我的问题的背景下。 –

回答

2

这是非常复杂的,它不能合理地推断闭包签名。因此请指定它:

let arrayOfSuperCheese = arrayOfMilk.map { (milk: Milk) -> Cheese in 
    let cheese = Cheese(usingMilk: milk) 
    let sulfur = Sulfur() 
    let minerals = Minerals() 
    let mixer = Mixer() 

    let superCheese = mixer.mixIn(sulfur: sulfur, minerals: minerals) 
    return superCheese 
} 
+0

显然,这个闭包中的'cheese'常量没有被使用,但我想尽可能地保留你的代码片段。另外,根据以下常见约定,我不会使用'useMilk'(或'withMilk',您在其他地方参考)第一个参数“Cheese”,而不是'milk',但这取决于您。 – Rob

+0

感谢您的回答和建议。只要我明确定义了结束签名,它就会工作。您是否知道何时需要明确的结束签名? –

+0

不,我不知道确切的阈值,但它的例子比这个简单得多。例如。 '让奶酪=牛奶。地图{让奶酪=奶酪(牛奶:$ 0);返回芝士}'。有一些行为会随着多行封闭而改变,所以也许就是这样,但我怀疑它可能比这更微妙。底线,我用推断的类型编写代码,直到编译器告诉我它不能再推断为止,然后我明确指定参数。 – Rob