用Swift中的键“预加载”字典

时间:2017-11-04 12:11:14

标签: ios arrays swift dictionary

这是一个相当简单的问题,但是我想解决这个问题,因为 MAY 可以帮助提高性能。

我想知道Swift是否有办法创建一个Dictionary,指定 ONLY 键,可能没有值,或者每个条目中设置的单个值。

换句话说,我想创建一个Dictionary对象,并“预加载”它的键。由于这是Swift,因此值可以是0或nil(或者默认值为空)。

这样做的原因是,我可以避免两个循环,我经历一次,用键和空值填充一个字典,然后第二个,然后我设置这些值(有一个实际的理由,想要这个问题有点超出了这个问题的范围。)

以下是我的想法:

func gimme_a_new_dictionary(_ inKeyArray:[Int]) -> [Int:Int] {
    var ret:[Int:Int] = [:]
    for key in inKeyArray {
        ret[key] = 0
    }

    return ret
}

let test1 = gimme_a_new_dictionary([4,6,1,3,0,1000])

但是我想知道是否有更快的方法来做同样的事情(就像在“语言构造”方式 - 我可能想出一个更快的方法在一个函数中做到这一点。)

更新:第一个解决方案 ALMOST 有效。它在Mac / iOS中运行良好。但是,Swift 3的Linux版本似乎没有uniqueKeysWithValues初始化程序,这很烦人。

func gimme_a_new_dictionary(_ inKeyArray:[Int]) -> [Int:Int] {
    return Dictionary<Int,Int>(uniqueKeysWithValues: inKeyArray.map {($0, 0)})
}

let test1 = gimme_a_new_dictionary([4,6,1,3,0,1000])

2 个答案:

答案 0 :(得分:2)

对于Swift 4,您可以使用带有序列的字典构造函数,并使用map从键数组中创建元组序列:

let dict = Dictionary(uniqueKeysWithValues: [4,6,1,3,0,1000].map {($0, 0)})

答案 1 :(得分:1)

我认为您可以通过在初始化期间指定最小容量来优化分配方面的代码。然而,一个班轮可能是上述答案,它基本上是分配和循环以在每个位置加0。

func gimme_a_new_dictionary(_ inKeyArray:[Int], minCapacity: Int) -> [Int:Int] {
    var ret = Dictionray<Int, Int>(minimumCapacity: minCapacity)
    for key in inKeyArray {
        ret[key] = 0
    }

    return ret
}

let test1 = gimme_a_new_dictionary([4,6,1,3,0,1000])

请查看此官方文档:

    /// Use this initializer to avoid intermediate reallocations when you know
    /// how many key-value pairs you are adding to a dictionary. The actual
    /// capacity of the created dictionary is the smallest power of 2 that
    /// is greater than or equal to `minimumCapacity`.
    ///
    /// - Parameter minimumCapacity: The minimum number of key-value pairs to
    ///   allocate buffer for in the new dictionary.
    public init(minimumCapacity: Int)