在操场上尝试下列操作时,会出现以下错误:
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 })我做错了什么吗?
发布于 2014-08-25 21:00:42
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书的“关闭”章节中都有详细的描述。
更新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]https://stackoverflow.com/questions/25494236
复制相似问题