创建n个对象的数组(UILabel)并将它们与另一个String数组映射

时间:2018-11-22 13:31:57

标签: ios swift functional-programming

我面临两个问题。我想创建一个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 :(得分:2)

  1. Array(repeating:count:)确实意味着重复。 repeating参数的表达式仅计算一次。请改用(0..<count).map

  2. 使用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
}

答案 1 :(得分:0)

您是否尝试过将weekdayLabels数组声明为private lazy var

过去,我在声明其他UIKit对象的数组时遇到了问题(假设因为故事板可能已将其实例化或未将其实例化),所以不得不诉诸以下内容来访问{{1 }}(自定义的,可切换的ToggleButton实现),位于可选的按钮数组中:

UIButton