2017-01-22 3 views
-1

У меня есть довольно много подобных UILabels Я настраиваю код. В Objective-C Я хотел бы сделать что-то вроде этого (псевдо-код):Swift How to for in in over

@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, но это разделяет мой код на разные области.

Благодаря

+1

Почему у вас 10 переменных метки вместо одной переменной массива в первых местах? – Sulthan

+0

справедливая точка ;-) Я собираюсь реализовать что-то вроде vacawama, предложенное – Joseph

ответ

2

Вы делаете это в 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 класс, который является reference type. Это означает, что в очень реальном смысле l - это указатель, каждый бит в Swift, как и в Objective-C (где указатель явно выражен синтаксисом UILabel*).


Extra Credit

С другой стороны, до тех пор, как вы не собираетесь писать все эти изменения обратно в 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, а затем передать его другому методу, вам может быть безразлично.

+0

Желаю получить дополнительный кредит. Этот два вариационных ответа заслуживает этого. СПАСИБО! – Confused

+0

Обратите внимание, что вы также можете сказать 'для var s в 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

 Смежные вопросы

  • Нет связанных вопросов^_^