2017-01-22 81 views
-1

我有很多类似UILabels我在代码中设置。 在Objective-C,我会做这样的事情(伪代码):Swift如何在for循环引用

@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]; 
} 

我将如何做到这一点的斯威夫特?我如何将参考传递给for in循环中的变量? 我发现的唯一选择是使用inout参数创建函数,但将我的代码拆分到不同的区域。

感谢

+1

为什么你有10个标签变量,而不是一个数组变量在第一个地方? – Sulthan

+0

公平点;-)我要实施像vacawama建议 – Joseph

回答

2

你做的雨燕正是你做它在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是一类,这是一个reference type。这意味着,在一个非常真实的意义上,l是Swift中Objective-C中指针的每一位,其中指针的性质由UILabel*语法明确表示。


加分

在另一方面,只要你不打算所有这些变化写回lbls,你也可以做这项工作,即使这是一个值类型。您必须将l分配到循环内部的var以便更改它。

因此,让我们假设为了说明的目的,我们在这里有一个结构。然后你会说:

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然后将其交给其他方法,那么您可能不会在意这一点。

+0

我希望额外的信贷可以给。这两个变化的答案值得。谢谢! – Confused

+0

请注意,你也可以说'for var s in myArrayOfStructs {...}' – Hamish

+0

@Hamish是的,我害怕这种语法,因为他们有一段时间威胁要删除它。 – matt

1

它可以几乎完全相同。

我会做这样......

labels.forEach { 
    $0.backgroundColor = .red 
    view.addSubview($0) 
} 
1

为什么有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) 
} 
+0

好点。马特的答案回答了我原来的问题 - 我将继续解决这个问题。 +1 – Joseph