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)
}