我正在寻找一种将[String : Any?]
类型的字典转换为[String: AnyObject]
字典的简单方法。我可以单独循环遍历元素,但这对我来说似乎是“错误的”。
如果我只是试图施放原始字典,我就会崩溃。
let dict:[String : Any?] = ["something" : "else"]
// crashes with fatal error: 'can't unsafeBitCast
// between types of different sizes'
let newDict = dict as? [String: AnyObject]
答案 0 :(得分:2)
循环完全正确,Swift鼓励这一点。最有效和类似Swift的方法是:
var result = [String: AnyObject]()
for (key, value) in dict {
if let v = value as? AnyObject {
result[key] = v
}
}
(*)这不是真正的“类似Swift”,因为它包含AnyObject
,它几乎不应该是非临时数据结构的一部分。正确的Swift实现会将AnyObject
转换为实际类型。
请注意,您获得的崩溃绝对不合适,您应该打开雷达(bugreport.apple.com)。 as?
永远不会像这样崩溃。您应该获得nil
或编译器失败。
答案 1 :(得分:1)
警告:正如评论中提到的@ rob-napier,它的O(n ^ 2)所以这种方法仅适用于小字典(少于100个元素)。
您可以使用reduce
:
let dict:[String : Any?] = ["something" : "else"]
let newDict = dict.reduce([String: AnyObject](), combine: { accumulator, pair in
var temp = accumulator
temp[pair.0] = pair.1 as? AnyObject
return temp
})
此处newDict
的类型为[String: AnyObject]
。