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

时间:2014-08-25 20:54:47

标签: xcode sorting swift

在操场上尝试以下操作时,出现以下错误:

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 })

我做错了吗?

1 个答案:

答案 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]