我一直在玩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'的子类型
我没有得到第二个错误,因为这不一定是一个子类型,反之亦然。关于如何解决这个问题的任何想法?我没有找到几个小时的谷歌和研究的答案。
答案 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)