在操场上尝试以下操作时,出现以下错误:
Cannot invoke 'sort' with an argument list of type '([Int], (Int, Int) -> Bool)'
let stuff = [1, 2, 3]
var sortedStuff = sort(stuff, { (left: Int, right: Int) -> Bool in left < right })
我做错了吗?
答案 0 :(得分:7)
sort()
就地排序数组:
var stuff = [3, 2, 1]
sort(&stuff, { (left: Int, right: Int) -> Bool in left < right })
println(stuff) // [1, 2, 3]
sort()
的第一个参数必须是变量数组的地址(它不会返回值) 。当您通过时,这会导致(误导性)错误消息
一个数组作为第一个参数。
您可能想要使用的是sorted()
,它不会修改原始数组并返回一个新的排序数组:
let stuff = [3, 2, 1]
var sortedStuff = sorted(stuff, { (left: Int, right: Int) -> Bool in left < right })
println(stuff) // [3, 2, 1]
println(sortedStuff) // [1, 2, 3]
在早期的一个beta版本中,函数名称发生了变化,如中所述 发行说明
重要更改,Xcode 6 beta 1-3中已解决的问题
...
全局sort
函数现在改变其第一个参数和一个新参数sorted
函数始终返回一个新集合。
所以有些教程可能已经过时了。 但是,Swift书籍会定期更新,因此您可能需要下载 当前版本。
如评论中所述,您可以通过各种方式缩短闭包表示法:
let sortedStuff = sorted(stuff, { left, right in left < right }) // Inferring type from context
let sortedStuff = sorted(stuff, { $0 < $1 }) // Shorthand argument names
let sortedStuff = sorted(stuff, <) // Using an operator function
所有这些都在Swift书的"Closures"章节中详细描述。
更新 Swift 2(Xcode 7):调用返回已排序的数组 再次“排序”,但它现在是一种(协议扩展)方法 全球职能:
let stuff = [3, 2, 1]
let sortedStuff = stuff.sort(<)
print(sortedStuff) // [1, 2, 3]
并对数组进行排序已重命名为“sortInPlace”:
var stuff = [3, 2, 1]
stuff.sortInPlace(<)
print(stuff) // [1, 2, 3]