提问人:Erik P. Hansen 提问时间:6/8/2015 最后编辑:Jonathan LefflerErik P. Hansen 更新时间:7/25/2015 访问量:873
Swift Array.sort() 不接受速记格式的闭包
Swift Array.sort() won't accept closure in shorthand format
问:
我在使用 Array.sort() 函数时遇到了一个奇怪的问题。它不接受速记闭包。Xcode 在使用速记闭包时会抱怨以下消息: 但它适用于相同闭包的较长形式。Cannot invoke 'sort' with an argument list of type '((_, _) -> _)'
var names = ["Al", "Mike", "Clint", "Bob"]
// This `sort()` function call fails:
names.sort {
$0.localizedCaseInsensitiveCompare($1) == .OrderedAscending
}
// This `sort()` function call works:
names.sort { (first: String, second: String) in
return first.localizedCaseInsensitiveCompare(second) == .OrderedAscending
}
为了让事情变得更加奇怪,如果我先使用闭包的长形式,然后使用速记形式再次排序,它就可以正常工作了!
var names = ["Al", "Mike", "Clint", "Bob"]
// Works fine, orders the array alphabetically
names.sort { (first: String, second: String) in
return first.localizedCaseInsensitiveCompare(second) == .OrderedAscending
}
// This shorthand version now works as well, reversing the order of the array
names.sort {
$0.localizedCaseInsensitiveCompare($1) == .OrderedDescending
}
所以,最好的情况是,我做错了什么,可以学到一些东西。最坏的情况是,这只是 Xcode 或 Swift 的一个愚蠢的错误。
有什么想法吗?
答:
-1赞
ergoon
6/15/2015
#1
正如 R 指出@Martin,问题的根源在于,您正在对 Swift String 类型调用 NSString 的方法。
这工作正常
names.sort {
$0 <= $1
}
评论
0赞
Erik P. Hansen
6/17/2015
有两件事:首先,Swift String 和 NSString 应该是免费桥接的,因此在 Swift String 上调用 NSString 方法将起作用。或者至少它应该如此。其次,您使用的比较方法(用于比较两个字符串)与不区分大小写的比较不同。<=
上一个:闭包会破坏序列化吗
下一个:如何使用异步闭包来捕获和接受引用
评论
swiftc
NSComparisonResult
let x: NSComparisonResult
localizedCaseInsensitiveCompare
其实是 的 一个 Foundation 方法。似乎自动桥接不知何故不起作用。在编译该代码之前引用任何 Foundation 方法就足够了,例如 .NSString
let s = NSString()