快速游乐场中单表达式闭包的隐式返回

时间:2014-10-08 05:30:40

标签: swift

根据Apple的Swift书,而不是

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var reversed = sorted(names, { s1, s2 in return s1 > s2 })

因为闭包的主体包含单个表达式 s1> s2 返回Bool,没有歧义,因此 return 关键字可以省略:

reversed = sorted(names, { s1, s2 in s1 > s2 })

嗯,这在Playground中不起作用。 Playground中的错误表示不明确地使用运算符''

更新:同样,这个

reversed = sorted(names, { $0 > $1 })

不起作用。同样的错误。此

reversed = sorted(names, { return $0 > $1 })

一样。

更新2 :看到Mike S的回答后,我确信这个错误可能是由于Swift String和NSString造成的。我试过了

let nums = [3, 5, 1, 2, 10, 9]
var dec = sorted(nums, { n1, n2 in n1 > n2 })
var inc = sorted(nums, { n1, n2 in n1 < n2 })

他们都使用或不使用import语句。解决String的问题并不坏,因为现在我们只需要在使用&gt;来比较String时输入return。操作

那么这里可以解释什么(没有检查过正常项目)?

1 个答案:

答案 0 :(得分:5)

这里的问题实际上是比较StringArray Int <>Array运算符配合使用,但Strings <只有String import Foundation let result1 = "Chris" < "Alex" // false let result2 = "Chris" > "Alex" // error: ambiguous use of operator '>' 运算符将起作用(无论如何,从Xcode 6.1 GM开始)。

要表明这是Playground execution failed: <EXPR>:17:9: error: ambiguous use of operator '>' "Chris" > "Alex" ^ Foundation.>:1:6: note: found this candidate func >(lhs: String, rhs: NSString) -> Bool ^ Foundation.>:1:6: note: found this candidate func >(lhs: NSString, rhs: String) -> Bool 比较的问题,请在游乐场中尝试:

"Chris"

如果您打开Playground的控制台输出,您还会看到:

"Alex"

因此,问题似乎是编译器无法确定StringNSStringimport还是NSString s。

此外,如果您在Playground顶部取出默认的String语句,一切都会正常运行,因为let result1 = "Chris" < "Alex" // false let result2 = "Chris" > "Alex" // true 未导入,因此不会桥接到{{1 }}:

import

或者,要使用问题中的代码(否let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] let reversed = sorted(names, { $0 > $1 }) // [Alex, Barry, Chris, Daniella, Ewa] ):

>

我无法回答的是,如果您在传递给return的闭包中使用sorted语句,{{1}} 的原因是什么?