【问题标题】:Swift Array(repeating:, count:) behaviourSwift Array(repeating:, count:) 行为
【发布时间】:2018-01-12 14:43:59
【问题描述】:

为什么labels 数组中只有一个元素显示为view 的子视图,特别是在使用Array(repeating:, count:) 时?

let labels = Array(repeating: UILabel(), count: 7)

print(labels.count) //7

let view = UIView()

for label in labels {
    view.addSubview(label)
}

print(view.subviews.count) //1

【问题讨论】:

标签: arrays swift


【解决方案1】:

这是因为Array(repeating:count:) 创建了一个包含 7 个变量的数组,这些变量指向相同的标签。

由于所有 7 个元素都指向同一个实例,因此子视图的计数将为 1。

【讨论】:

    【解决方案2】:

    这是Array.init(repeating:count:) 的预期行为。将其实现视为:

    // not real code! This is just to illustrate what happens!
    init(repeating repeatedValue: Array.Element, count: Int) {
        for _ in 0..<count {
            self.append(repeatedValue)
        }
    }
    

    此处不会创建新标签。只有 7 个引用指向同一个标签。

    无论如何,以这种方式创建 7 个标签是没有用的。它们都将位于相同的位置并具有相同的大小和text。看起来好像只有一个标签。因此,只需使用 for 循环。

    编辑

    这是一个具有您想要的行为的扩展:

    extension Array {
        init(repeating: (() -> Element), count: Int) {
            self = []
            for _ in 0..<count {
                self.append(repeating())
            }
        }
    }
    

    像这样使用它

    Array(repeating: UILabel.init, count: 7)
    

    由于这在创建标签时不是很有用,我们可以更改闭包类型以包含Int 参数。这样我们可以创建不同的标签:

    init(repeating: ((Int) -> Element), count: Int) {
        self = []
        for i in 0..<count {
            self.append(repeating(i))
        }
    }
    
    // a horizontal row of square labels!
    Array(repeating: { UILabel(frame: CGRect(x: $0 * 100, y: 0, width: 50, height: 50)) })
    

    现在感觉有点像 for 循环...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      相关资源
      最近更新 更多