我已经看到大多数swift开发人员都开始使用.forEach,了解它的另一种迭代数组的方式。但是'$ 0'的含义是什么?它是如何工作的?如果它是一个索引,那么它应该增加0,1,2 ...
@IBOutlet var headingLabels: [UILabel]!
....
headingLabels.forEach { $0.attributedText = NSAttributedString(string: $0.text!, attributes: [NSKernAttributeName: 1]) }
答案 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
forEach
与for-in
构造我们可以说$0
与下面代码中的n
值类似吗?
for n in nums {
print(n)
}
是的,它的含义几乎相同。
forEach
方法接受闭包。关闭有这个签名。
(Self.Generator.Element) throws -> Void
当您使用forEach
时,它会与您签订“合同”。
forEach
提供一个闭包,该闭包接受输入中的单个参数,其中param具有相同类型的数组forEach
会将该闭包应用于数组的每个元素。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参数。
答案 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
}