gpt4 book ai didi

swift - swift playground 中单表达式闭包的隐式返回

转载 作者:搜寻专家 更新时间:2023-10-31 08:27:41 27 4
gpt4 key购买 nike

根据 Apple 的 THE Swift 书,而不是

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

因为闭包的主体包含返回 Bool 的单个表达式 s1 > s2,所以没有歧义,所以可以省略 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 的解决方案还不错,因为现在我们只需要在想要使用 > 运算符比较 String 时键入 return。

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

最佳答案

这里的问题实际上是比较String秒。一个ArrayInt s 适用于 <>运算符,但带有 ArrayStrings s,只有 <运算符将工作(无论如何从 Xcode 6.1 GM 开始)。

表明这是 String 的问题比较,在 Playground 中试试这个:

import Foundation
let result1 = "Chris" < "Alex" // false
let result2 = "Chris" > "Alex" // error: ambiguous use of operator '>'

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

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" 是否存在。和 "Alex"String s 或 NSString

此外,如果你去掉默认的import在 Playground 顶部声明,一切都会正常工作,因为 NSString未导入,因此未桥接到 String :

let result1 = "Chris" < "Alex" // false
let result2 = "Chris" > "Alex" // true

或者,使用问题中的代码(没有 import ):

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = sorted(names, { $0 > $1 }) // [Alex, Barry, Chris, Daniella, Ewa]

但我无法回答的是,为什么 >如果您使用 return确实有效闭包中的语句传递给 sorted .

关于swift - swift playground 中单表达式闭包的隐式返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26249784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com