【问题标题】:Why do some expressions log results and others just show iteration counts?为什么有些表达式记录结果而其他表达式只显示迭代计数?
【发布时间】:2023-03-22 16:05:01
【问题描述】:

我没有在 Swift 中使用过很多 Playgrounds。大多数情况下我一直在项目中使用它,所以我在处理游乐场时有点迷茫。

我在一个小操场上有这个测试代码:

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, &lt;)array.sorted(&lt;) 表单都有效?第一种是带 2 个参数的全局函数,第二种形式是 Array 类的方法。

【问题讨论】:

    标签: swift swift-playground


    【解决方案1】:

    这是因为你传递给sorted 的闭包被sorted 调用来进行13 个元素比较,因为它对数组进行排序,加上对sorted 本身的调用。每当您编写的一行代码在 Playground 中运行时,它都会显示表达式的结果或计数。因为同一行被多次计算,IDE 不能显示所有内容,所以它只显示计数。

    如果拆分成多行,可以看到sorted的结果,以及$0 &lt; $1的13次求值结果:

    我猜 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]
    

    【讨论】:

    • 另外一件事我忘了提 - 理论上 sorted 的成员版本可能更快,因为它可以了解更多关于其输入的信息,所以当你可以使用它时可能是首选。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多