UIViews的数组

时间:2014-11-11 19:31:02

标签: ios cocoa-touch swift uikit

有没有办法创建一个UIViews数组?

我尝试过bot我无法添加值

var views = [UIView?](count: 64, repeatedValue: nil)

这导致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

3 个答案:

答案 0 :(得分:4)

在这一行:

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())
}

答案 1 :(得分:1)

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()

答案 2 :(得分:0)

使用Swift 4,您可以使用以下方法之一来解决问题。

#1。使用Rangemap(_:)

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。使用符合SequenceIteratorProtocol协议

的自定义结构
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)