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)
难道我做错了什么?
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)