xcode 6 beta 6 sort()似乎不像Swift文档所说的那样有用

mqu*_*eue 2 sorting xcode swift

在操场上尝试以下操作时,我收到以下错误:

Cannot invoke 'sort' with an argument list of type '([Int], (Int, Int) -> Bool)'
Run Code Online (Sandbox Code Playgroud)
let stuff = [1, 2, 3]
var sortedStuff = sort(stuff, { (left: Int, right: Int) -> Bool in left < right })
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

Mar*_*n R 7

sort() 对就地排列数组:

var stuff = [3, 2, 1]
sort(&stuff, { (left: Int, right: Int) -> Bool in left < right })
println(stuff)   // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

的第一个参数sort()必须是地址 a的可变阵列(和它不返回一个值).这会导致(误导性)错误消息,因为您将数组作为第一个参数传递.

您可能想要使用的是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]
Run Code Online (Sandbox Code Playgroud)

如发行说明中所述,早期测试版之一中的函数名称已更改

重要的变化,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
Run Code Online (Sandbox Code Playgroud)

所有这些都在Swift书的"闭包"一章中有详细描述.


更新Swift 2(Xcode 7):返回一个已排序的数组再次被称为"sort",但它现在是一个(协议扩展)方法而不是全局函数:

let stuff = [3, 2, 1]
let sortedStuff = stuff.sort(<)
print(sortedStuff)   // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

并在适当的位置排序数组已重命名为"sortInPlace":

var stuff = [3, 2, 1]
stuff.sortInPlace(<)
print(stuff)   // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)