【问题标题】:How to initialize an array using `repeating:count:` with distinct objects? [duplicate]如何使用具有不同对象的“重复:计数:”初始化数组? [复制]
【发布时间】:2016-11-14 01:03:26
【问题描述】:

令人惊讶的是,下面的代码打印出SAME,而初始化程序每次都应该调用Z() 构造函数。如何使用此方法对 Z 的不同实例初始化数组?

import Foundation

class Z {
    var i: Int = 0
}

var z: [Z] = [Z](repeating: Z(), count: 10)

if z[0] === z[1] {
    print("SAME")
} else {
    print("NOT SAME")
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    我为此做了一个扩展!

    extension Array {    
        /// Create a new Array whose values are generated by the given closure.
        /// - Parameters:
        ///     - count:            The number of elements to generate
        ///     - elementGenerator: The closure that generates the elements.
        ///                         The index into which the element will be
        ///                         inserted is passed into the closure.
        public init(generating elementGenerator: (Int) -> Element, count: Int) {
            self = (0..<count).map(elementGenerator)
        }
    }
    
    class Z {
        var i: Int = 0
    }
    
    let z = Array(generating: { _ in Z() }, count: 10)
    
    print(z)
    

    【讨论】:

    • self.indices 返回零。
    • 你能告诉我你的测试用例吗?
    • 我刚刚用init(generating elementGenerator): (Int) -&gt; Element, count: Int) 修正了拼写错误(称为生成)并用let z = [Z](generating: { _ in Z() }, count: 10) 尝试了它。数组为空。
    • 不走运。 self.indices 在您的 init 中返回一个空范围。我用 Swift 3.1 测试过。
    • 哦,是的,我在玩它,忘了提到那部分。现在已经修好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2010-09-26
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多