在Swift中将[String: Any]转换为[String: String]

4
如何在Swift中将[String: Any]转换为[String: String]。我尝试了像这样进行类型转换,但并没有起到作用:
for (key, value) in dictionary {
    dictionary[key] = value as! String
}

1
你能解释一下你的使用情况吗? - Frankenstein
为什么它没有帮助?你能解释一下你开始使用的数据是什么类型的吗?所有的值都是字符串类型吗?还是可能混合,如果是这样,那么非字符串值该怎么处理。 - Joakim Danielson
3个回答

13

这里提供了一种安全的方法,转换后只包含[String: String]类型,非字符串Any类型将被丢弃:

let converted = dictionary.compactMapValues { $0 as? String }

2
更新:如果您需要像#user在评论中提出的那样包括非字符串值,您可以使用以下方法:
let anyDict = ["String0": "0", "String1": 1] as [String : Any]
let stringDict = anyDict.compactMapValues { "\($0)" }

(旧)这里:

import Foundation

let anyDict = ["String0": "0", "String1": 1] as [String : Any]
var stringDict = [String: String]()

for (key, value) in anyDict {
    if let value = value as? String {
        stringDict[key] = value
    }
}
print(stringDict)

这对我不起作用。字典中除了字符串(例如布尔值或整数),其他类型都会被跳过,不会作为字符串添加到字典中。 - SouthernYankee65
1
@SouthernYankee65,请查看更新。 - Frankenstein
谢谢更新。这个可以直接使用。现在我需要找到一种处理嵌套字典的方法... [String:[String:[UInt32]]] - SouthernYankee65

0

如果你只是想做以下事情:

在Swift中将[String:Any]转换为[String:String]。

如果你愿意在任何Any不是String的情况下什么都不返回,那么你可以这样做:

安全:

if let stringDictionary = dictionary as? [String: String] {
    //Use your new stringDictionary here
}

不安全的:

let stringDictionary = dictionary as! [String: String]

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