如何在swift中将Dictionary分配给AnyObject

时间:2015-04-18 20:57:55

标签: arrays swift dictionary casting

我一直在玩Swift。我有类型的多个错误,特别是使用Swift和我的旧Objective-C类。这个方法的问题是:我期待在Objective-C中由NSDictionarys构成的数组。

var curArr:[Dictionary<String, AnyObject>] = self.getItemsForCurrentStack()
var arrToReturn:[(Dictionary<String, AnyObject?>)] = []
for obj in curArr{
    arrToReturn.append(["image": UIImage(named: obj["imageName"] as! String), "color": UIColor(red:obj["colorDic"]!["red"] as! CGFloat, green:obj["colorDic"]!["green"] as! CGFloat, blue:obj["colorDic"]!["blue"] as! CGFloat, alpha:1.0), "percentage": obj["percantage"]])
}
return arrToReturn

这将返回Swift中的Dictionaries(NSDictionaries)。但最后一行引发了一个错误:

  

Dictionary'与'AnyObject'

不同

我尝试过使用as! [AnyObject]

但是这引发了另一个错误:

  

'AnyObject'不是'Dictionary'的子类型

我没有得到第二个错误,因为这不一定是一个子类型,反之亦然。关于如何解决这个问题的任何想法?我没有找到几个小时的谷歌和研究的答案。

3 个答案:

答案 0 :(得分:8)

Dictionary是Swift中的结构,而AnyObject

  

///所有类隐含符合的协议。

根据您要执行的操作,您可能希望在代码中使用Any,或使用as NSDictionary将字典转换为NSDictionary。


澄清之后编辑:

如果您从字典本身拆分append来电,则会看到更好的错误消息:

因此,问题是您的字典包含一些Optional值,但Optional是一个结构,不能转换为Obj-C。您可以通过转换为UIImage!AnyObject!(ImplicitlyUnwrappedOptional)或使用as!进行修复。

答案 1 :(得分:1)

您的代码在游乐场中运行良好,没有编译或运行时错误。以下是我为填充curArr添加的内容:

var curArr:[Dictionary<String, AnyObject>] = [
    [
        "imageName" : "photo.jpg",
        "colorDic" : ["red" : 1.0, "green" : 0.0, "blue" : 0.0],
        "percentage" : 0.5
    ]
]

所有这一切都被迫展开,我认为你必须确保self.getItemsForCurrentStack()返回的确是你所期望的。

游乐场的结果:

[
 "percentage": {Some 5.0e+-1}, 
 "image": nil, 
 "color": {Some r 1,0 g 0,0 b 0,0 a 1,0}
]

我的建议是重构对象 - 这会使你的代码更具可读性!

答案 2 :(得分:0)

在Swift 3中

code:

var curArr:[Dictionary<String, Any>] = [
[
        "imageName" : "photo.jpg",
        "colorDic" :[
            "red" : 1.0,
            "green" : 0.0,
            "blue" : 0.0
        ],
        "percentage" : 0.5
    ]
]

enter image description here