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

SaR*_* DM 6 arrays macos foreach ios swift

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

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

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

Luc*_*tti 12

简短的回答

看看这段代码

let nums = [1,2,3,4]
nums.forEach { print($0) }
Run Code Online (Sandbox Code Playgroud)

这里的关闭如下 forEach

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

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

所以第一次包含1,然后2等等......

这是输出

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

forEachfor-in构造比较

那么我们可以说tha $0就像n下面代码中的值一样吗?

for n in nums {
    print(n)
}
Run Code Online (Sandbox Code Playgroud)

是的,它具有几乎相同的含义.

它是如何工作的?

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

(Self.Generator.Element) throws -> Void
Run Code Online (Sandbox Code Playgroud)

当你使用forEach它时,与你签订"合同".

  1. 您提供了forEach一个闭包,它接受输入中的单个参数,其中param具有相同类型的Array
  2. 将该forEach闭包应用于数组的每个元素.

nums.forEach { (n) in
    print(n)
}
Run Code Online (Sandbox Code Playgroud)

但是在Swift中,您可以省略闭包参数的显式名称.在封闭内部,您可以将params $0用于第一个参数,$1第二个参考等等.

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

nums.forEach {
    print($0)
}
Run Code Online (Sandbox Code Playgroud)


Asd*_*bal 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