Создайте массив из n объектов (UILabel) и сопоставьте их с другим массивом String - PullRequest
0 голосов
/ 22 ноября 2018

У меня две проблемы.Я хочу создать массив UILabel.Я попытался:

private var weekdayLabels = [DayLabel](repeating: DayLabel(), count: 7), но он использует тот же экземпляр DayLabel().

. В итоге я воспользовался другим, гораздо более уродливым решением:

(0...6).forEach { _ in
        weekdayLabels.append(DayLabel())
}

Есть ли способ заставить [DayLabel](repeating: DayLabel(), count: 7) работать?

Вторая проблема возникает при отображении массива String с именами дней недели в мой массив [UILabel]:

weekdayLabels.enumerated().forEach {
        $0.element.text = weekdayNames[$0.offset]
}

Я считаю, что должен быть лучший способ сопоставить String с UILabel().text.Я прав?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018
  1. Array(repeating:count:) действительно означает повторение.Выражение для аргумента repeating вычисляется только один раз.Вместо этого используйте (0..<count).map.

  2. Ue zip, чтобы связать каждую метку с соответствующей строкой.

Код:

weekDayLabels = (0..<7).map { _ in DayLabel() }

let weekDayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
zip(weekDayLabels, weekDayNames).forEach { label, dayName in
    label.text = dayName
}
0 голосов
/ 22 ноября 2018

Вы пытались объявить свой массив weekdayLabels как private lazy var?

В прошлом у меня были проблемы с объявлением массивов других объектов UIKit (если предположить, что они могут быть созданы или не созданы ещераскадровка) и пришлось прибегнуть к следующему, чтобы получить доступ к состоянию ToggleButton (пользовательская реализация с возможностью переключения UIButton) в необязательном массиве кнопок:

lazy var buttonsArray = {
    [buttonOne, buttonTwo, buttonThree]
}()

...

if buttonsArray[index]?.isOn == true {
        buttonsArray[index]?.buttonPressed()
}
...