如何将字典转换为数组

48
我想将我的字典转换成数组,通过将字典中的每个[String : Int]显示为数组中的字符串。 例如:     
var myDict: [String : Int] = ["attack" : 1, "defend" : 5, "block" : 12]

我知道myDict.keys.arraymyDict.values.array,但是我想让它们一起显示在一个数组中。这是我的意思:

var myDictConvertedToArray = ["attack 1", "defend 5", "block 12"]

8
请注意,myDict.values.array 现在是 Array(myDict.values) - Chris Prince
1
这对于Swift 5仍然有效吗? - thejdah
5个回答

62
您可以使用for循环来遍历字典的键/值对,以构建您的数组:
var myDict: [String : Int] = ["attack" : 1, "defend" : 5, "block" : 12]

var arr = [String]()

for (key, value) in myDict {
    arr.append("\(key) \(value)")
}

注意: 字典是无序的,因此您的数组顺序可能不符合您的预期。


Swift 2及更高版本中,也可以使用map来完成此操作:

let arr = myDict.map { "\($0) \($1)" }

这也可以写成:

let arr = myDict.map { "\($0.key) \($0.value)" }

如果不介意长度稍长,那么更清晰易懂。


我发现它不支持将解构参数转换为(key,value)($0,$1),因此我需要使用$0.key。 - Michał Ziobro
@MichałZiobro,我刚刚在Xcode 9.2中使用Swift 4重新测试了这两个答案,并且它们都按照所述方式工作。你的情况有什么不同吗? - vacawama

20

在Swift 3中,将字典作为数组创建的通用方法是(我认为这也适用于旧版本的swift):

let arrayFromDic = Array(dic.values.map{ $0 })

例子:

let dic = ["1":"a", "2":"b","3":"c"]

let ps = Array(dic.values.map{ $0 })

print("\(ps)")

for p in ps {
    print("\(p)")
}

你不会告诉我们打印的结果吗? - undefined

7
如果您喜欢简洁的代码并且更偏向于函数式编程,您可以使用在键集合上执行的map方法:
let array = Array(myDict.keys.map { "\($0) \(myDict[$0]!)" })

或者,正如@vacawama建议的那样:
let array = myDict.keys.array.map { "\($0) \(myDict[$0]!)" }

等同于此功能。

不错,@Antonio!它也可以写成 let array = myDict.keys.array.map { "\($0) \(myDict[$0]!)" }。性能相同,而且少了一个字符。 :-) - vacawama

7

使用 Swift 5

var myDict:[String : Int] = ["attack" : 1, "defend" : 5, "block" : 12]

let arrayValues = myDict.values.map({$0})
let arrayKeys = myDict.keys.map({$0})

2
你需要遍历并从键和值中构建一个新的数组。
可以看一下 Swift数组文档

你可以通过调用数组的append(_:)方法向数组末尾添加一个新项:

试试这个:
var myDict:[String : Int] = ["attack" : 1, "defend" : 5, "block" : 12]

var dictArray: [String] = []

for (k, v) in myDict {
    dictArray.append("\(k) \(v)")
}

如果你正在使用Swift 2.0,请查看在Swift中将map()应用于字典的最干净的方法是什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接