【问题标题】:Array of UIViewsUIViews 数组
【发布时间】:2014-11-11 19:31:01
【问题描述】:
有没有办法创建 UIViews 数组?
我试过机器人我无法添加值
var views = [UIView?](count: 64, repeatedValue: nil)
结果为零
views[0]?.backgroundColor = UIColor.redColor()
我也试过了
var views = NSMutableArray()
for (var a = 0; a<100; a++){
views[a] = UIView()
}
views[0].backgroundColor = UIColor.redColor() // fails
【问题讨论】:
标签:
ios
cocoa-touch
swift
uikit
【解决方案1】:
在这一行:
var views = [UIView?](count: 64, repeatedValue: nil)
您正在创建一个可选数组,用nil 填充 - 这就是您使用repeatedValue 参数设置的内容。正确的做法是:
var views = [UIView](count: 64, repeatedValue: UIView())
但是请注意,它只创建一个 UIView 实例,并将其分配给所有 64 个元素。
另外,除非有特殊原因,否则我认为您不需要一组可选项,因此应考虑使用[UIView]
也就是说,如果您想要一个唯一实例数组,您可以使用以下代码:
var views = [UIView]()
for _ in 1...100 {
views.append(UIView())
}
【解决方案2】:
var views = [UIView]()
views.reserveCapacity(100) // not necessary but improves performance just a little bit
for var i = 0; i < 100; i++ {
views.append(UIView())
}
views[0].backgroundColor = UIColor.redColor()
【解决方案3】:
使用 Swift 4,您可以使用以下方法之一来解决您的问题。
#1。使用Range 和map(_:)
let range = 0 ... 5
let array = range.map { _ in UIView() }
#2。使用 Range 和 for 循环
var array = [UIView]()
for _ in 0 ..< 5 {
array.append(UIView())
//array += [UIView()] //also works
}
#3。使用AnyIterator
let anyIterator = AnyIterator(UIView.init)
let array = Array(anyIterator.prefix(5))
#4。使用符合Sequence 和IteratorProtocol 协议的自定义结构
struct ViewSequence: Sequence, IteratorProtocol {
let count: Int
private var index = 0
init(count: Int) {
self.count = count
}
mutating func next() -> UIView? {
guard index < count else { return nil }
defer { index = index.advanced(by: 1) }
return UIView()
}
}
let sequence = ViewSequence(count: 5)
let array = Array(sequence)