为什么有些表达式记录结果而其他表达式只显示迭代计数?

时间:2015-04-14 23:16:16

标签: swift swift-playground

我还没有和Swift一起使用游乐场。大多数情况下,我一直在项目中使用它,所以我在与游乐场打交道时有点迷失。

我在一个小操场上得到了这个测试代码:

let array = [7, 3, 4, 9, 2, 12, 5]
let firstSorted = array.sorted(<)
let secondSorted = sorted(array, <)
let thirdSorted = array.sorted { $0 < $1 }

右侧显示的输出显示firstSorted和secondSorted旁边的排序数组输出。然而,thirdSorted旁边的输出只是说了(15次)。

为什么呢?如何在不添加单独的println命令来记录输出的情况下查看输出?

第三种形式有一个尾随闭包,其参数由其位置指定。

另外两个是一个更简短的形式,仅采用比较运算符,恰好匹配所需的闭包的签名。

另一个问题:(这次关于语言,而不是游乐场)为什么sorted(array, <)array.sorted(<)形式都有效?第一个是带有2个参数的全局函数,第二个是Array类的方法。

1 个答案:

答案 0 :(得分:3)

这是因为你传递给sorted的闭包由sorted调用,在对数组进行排序时加上对sorted本身的调用进行13次元素比较。每当您编写的代码行在操场中运行时,它会显示表达式的结果或计数。由于多次评估同一行,因此IDE无法显示所有内容,因此它只显示计数。

如果您将其分成多行,则可以看到sorted的结果,以及$0 < $1的13次评估的结果:

Image showing 13 executions plus result

我想IDE可以采用最外层结果最有趣的方法,并显示,但这可能隐藏了多次调用闭包的信息。

关于第二个问题:sorted的全局2参数版本更为通用。它对任何类型的序列进行排序:

// they should probably rename this placeholder to S...
func sorted<C : SequenceType>
  (source: C, isOrderedBefore: (C.Generator.Element, C.Generator.Element) -> Bool) 
  -> [C.Generator.Element]

因此您可以传递符合SequenceType的任何内容:

// results in [4,3,2,1,0]
sorted(0..<5, >)  

// results in [(3,"bob"),(2,"fred")] because dictionary’s 
// SequenceType representation is unordered pairs
sorted([2:"fred",3:"bob"]) { $0.1 < $1.1 }

此外,由于全局函数可以基于约束输入进行重载,因此如果输入序列的元素为Comparable,则可能存在根本不需要比较器的重载版本:

func sorted<C : SequenceType where C.Generator.Element : Comparable>
  (source: C) -> [C.Generator.Element]