首页 > 解决方案 > 如何以相同的顺序从字典中获取键和值?

问题描述

我正在使用字典来存储键值对。它正确存储了 kay-value 对。但是当我尝试分别检索所有键和所有值时,它的打印方式不同。

这是示例,

    var sampleDic:[String:Any] = [:]
    sampleDic["one"] =  1
    sampleDic["two"] =  2
    sampleDic["three"] =  3

    print("keys: \(sampleDic.keys)")
    print("Values: \(sampleDic.values)")

有时它的印记,

 keys: ["one", "two", "three"]
 Values: [1, 2, 3]

有时它的指纹,

keys: ["three", "one", "two"]
Values: [3, 1, 2]

每次,每当我运行代码时,我都会得到不同的输出。

如何始终以相同的顺序获得键和值的输出。键和值都必须根据它们在字典中存储的键/值打印在数组中。

如果字典无法做到这一点,那么是否有另一种方法来存储和获取这样的值?

标签: arraysswiftswift-dictionary

解决方案


字典存储键和值之间的映射,而不是键值对的列表,因此没有顺序。

如果你想要一个订单,你可以通过对键值对进行排序来给它一个,例如通过键

ket kvp = Array(sampelDic).sorted { $0.key < $1.key }

这会产生一个[(String, Any)]. 如果你真的想要 a[String]和 a [Any],你可以写一个unzip函数(来自Rob 的回答):

func unzip<K, V>(_ array: [(key: K, value: V)]) -> ([K], [V]) {
    var keys = [K]()
    var values = [V]()

    keys.reserveCapacity(array.count)
    values.reserveCapacity(array.count)

    array.forEach { key, value in
        keys.append(key)
        values.append(value)
    }

    return (keys, values)
}

现在你可以这样做:

let (keys, values) = unzip(kvp)
print("Keys:", keys)
print("Values:", values)

推荐阅读