2017-01-22 50 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