Swift 如何 for-in 循环遍历引用
Swift How to for-in loop over references
我在代码中设置了很多类似的 UILabels
。
在 Objective-C 我会做这样的事情(伪代码):
@property (nonatomic, strong) UILabel *l1, *l2, *l3, *l4, *l5, *l6, *l7, *l8, *l9;
...
l1 = [[UILabel alloc] init];
l2 = [[UILabel alloc] init];
l3 = [[UILabel alloc] init];
...
NSArray *lbls = @[l1, l2, l3, l4, l5, l6, l7, l8, l9];
for(UILabel *l in lbls) {
l.textColor = [UIColor redColor];
l.hidden = YES;
...
[self.addSubview:l];
}
我如何在 Swift 中执行此操作?如何在 for in
循环中传递对变量的引用?
我找到的唯一选择是创建一个带有 inout
参数的函数,但这会将我的代码分成不同的区域。
谢谢
您在 Swift 中的操作与在 Objective-C 中的操作完全相同:
let lbls = [l1, l2, l3, l4, l5, l6, l7, l8, l9]
for l in lbls {
l.textColor = .red
l.isHidden = true
self.addSubview(l)
}
这与在 Objective-C 中的工作方式相同,因为 UILabel 是一个 class,它是一个 reference type。这意味着,在非常真实的意义上,l
是一个指针,在 Swift 中和在 Objective-C 中一样多(其中 pointer-ness 由 UILabel*
语法)。
额外学分
另一方面,只要您不打算将所有这些更改写回到 lbls
,即使这是一个值类型,您也可以使它工作。您必须将 l
分配给循环内的 var
才能更改它。
因此,为了便于说明,我们假设这里有一个 struct。那你会说:
let myArrayOfStructs = [l1, l2, l3, l4, l5, l6, l7, l8, l9]
for s in myArrayOfStructs {
var s = s // make a version of `s` we can modify
s.someProperty = newValue
self.someMethod(s)
}
但是,正如我所说,这会不会将更改写回到原始数组的内容中。尽管如此,如果您的唯一目的是配置每个 s
然后将其交给其他方法,您可能不会关心这一点。
几乎完全一样。
我会这样做...
labels.forEach {
[=10=].backgroundColor = .red
view.addSubview([=10=])
}
为什么有 9 个不同的变量来保存标签?您可以从数组中的所有这些开始,并在需要单独访问它们时将它们称为 labels[0]
、labels[1]
、...
和 labels[8]
:
// Create 9 UILabels and store them in [UILabel]
var labels = (1...9).map { _ in UILabel() }
...
for l in labels {
l.textColor = .red
l.isHidden = true
self.addSubview(l)
}
我在代码中设置了很多类似的 UILabels
。
在 Objective-C 我会做这样的事情(伪代码):
@property (nonatomic, strong) UILabel *l1, *l2, *l3, *l4, *l5, *l6, *l7, *l8, *l9;
...
l1 = [[UILabel alloc] init];
l2 = [[UILabel alloc] init];
l3 = [[UILabel alloc] init];
...
NSArray *lbls = @[l1, l2, l3, l4, l5, l6, l7, l8, l9];
for(UILabel *l in lbls) {
l.textColor = [UIColor redColor];
l.hidden = YES;
...
[self.addSubview:l];
}
我如何在 Swift 中执行此操作?如何在 for in
循环中传递对变量的引用?
我找到的唯一选择是创建一个带有 inout
参数的函数,但这会将我的代码分成不同的区域。
谢谢
您在 Swift 中的操作与在 Objective-C 中的操作完全相同:
let lbls = [l1, l2, l3, l4, l5, l6, l7, l8, l9]
for l in lbls {
l.textColor = .red
l.isHidden = true
self.addSubview(l)
}
这与在 Objective-C 中的工作方式相同,因为 UILabel 是一个 class,它是一个 reference type。这意味着,在非常真实的意义上,l
是一个指针,在 Swift 中和在 Objective-C 中一样多(其中 pointer-ness 由 UILabel*
语法)。
额外学分
另一方面,只要您不打算将所有这些更改写回到 lbls
,即使这是一个值类型,您也可以使它工作。您必须将 l
分配给循环内的 var
才能更改它。
因此,为了便于说明,我们假设这里有一个 struct。那你会说:
let myArrayOfStructs = [l1, l2, l3, l4, l5, l6, l7, l8, l9]
for s in myArrayOfStructs {
var s = s // make a version of `s` we can modify
s.someProperty = newValue
self.someMethod(s)
}
但是,正如我所说,这会不会将更改写回到原始数组的内容中。尽管如此,如果您的唯一目的是配置每个 s
然后将其交给其他方法,您可能不会关心这一点。
几乎完全一样。
我会这样做...
labels.forEach {
[=10=].backgroundColor = .red
view.addSubview([=10=])
}
为什么有 9 个不同的变量来保存标签?您可以从数组中的所有这些开始,并在需要单独访问它们时将它们称为 labels[0]
、labels[1]
、...
和 labels[8]
:
// Create 9 UILabels and store them in [UILabel]
var labels = (1...9).map { _ in UILabel() }
...
for l in labels {
l.textColor = .red
l.isHidden = true
self.addSubview(l)
}