将包含`Any?`的字典转换为`AnyObject`?

时间:2015-11-01 16:55:07

标签: swift

我正在寻找一种将[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]

2 个答案:

答案 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]