Swift:$ 0如何在Array.forEach中运行?

时间:2016-07-14 13:20:22

标签: ios arrays swift macos foreach

我已经看到大多数swift开发人员都开始使用.forEach,了解它的另一种迭代数组的方式。但是'$ 0'的含义是什么?它是如何工作的?如果它是一个索引,那么它应该增加0,1,2 ...

@IBOutlet var headingLabels: [UILabel]!
....

headingLabels.forEach { $0.attributedText = NSAttributedString(string: $0.text!, attributes: [NSKernAttributeName: 1]) }

3 个答案:

答案 0 :(得分:9)

简短回答

看看这段代码

let nums = [1,2,3,4]
nums.forEach { print($0) }

这里是forEach

之后的关闭
  

我的意思是这部分{ print($0) }

执行4次(对于数组中的每个元素一次)。每次执行$0都包含n-th数组的nums元素的副本

  

首次包含1,然后是2等等......

这是输出

1
2
3
4

forEachfor-in构造

进行比较

我们可以说$0与下面代码中的n值类似吗?

for n in nums {
    print(n)
}

是的,它的含义几乎相同。

它是如何工作的?

forEach方法接受闭包。关闭有这个签名。

(Self.Generator.Element) throws -> Void

当您使用forEach时,它会与您签订“合同”。

  1. 您向forEach提供一个闭包,该闭包接受输入中的单个参数,其中param具有相同类型的数组
  2. forEach会将该闭包应用于数组的每个元素。
  3. 实施例

    nums.forEach { (n) in
        print(n)
    }
    

    但是在Swift中,您可以省略闭包参数的显式名称。在封闭内部,您可以使用$0为第一个参数引用该参数,对于第二个参数使用$1,依此类推。

    所以前面的代码片段也可以写成如下所示

    nums.forEach {
        print($0)
    }
    

答案 1 :(得分:5)

  

速记参数名称

     

Swift自动为内联提供速记参数名称   闭包,可用于引用闭包的值   名称为$ 0,$ 1,$ 2等的参数。

     

如果在闭包中使用这些简写参数名称   表达式,你可以省略闭包的参数列表   定义,以及速记参数名称的数量和类型   将从预期的函数类型推断出来。 in关键字可以   也被省略,因为闭包表达式完全由   它的身体:

     

reversed = names.sort({$ 0> $ 1})这里,$ 0和$ 1引用   闭包的第一个和第二个String参数。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

答案 2 :(得分:1)

像“forEach”,“sort”这样的函数将闭包作为参数。这些闭包也有参数,例如关闭“forEach”函数,你可以提供自己的参数名,或使用默认的“$ 0”。如果闭包有多个参数(如函数“sort”),默认值为“$ 0”,如果你没有提供“$ 1”。请记住,闭包可以期望你返回一些值,比如“sort”。你有逻辑,这是例子:

let array: [String] = []
array.forEach { element in
    element.doStuff()
}

array.forEach {
    $0.doStuff()
}

let sortedArray = array.sort { first, second in
    return first < second
}

let sortedArray = array.sort {
    return $0 < $1
}