类型 '[String, AnyObject?]' 不符合协议 AnyObject?:为啥?
Posted
技术标签:
【中文标题】类型 \'[String, AnyObject?]\' 不符合协议 AnyObject?:为啥?【英文标题】:Type '[String, AnyObject?]' does not conform to protocol AnyObject?: why?类型 '[String, AnyObject?]' 不符合协议 AnyObject?:为什么? 【发布时间】:2014-11-17 19:03:45 【问题描述】:我试图了解为什么会出现编译错误:Type '[String, AnyObject?]' does not conform to protocol AnyObject?
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ] // <-- error
看起来cars
不是AnyObject?我不明白。
感谢您的帮助!
【问题讨论】:
【参考方案1】:AnyObject
必须是一个类,但Dictionary
是一个结构。
The Swift Programming Language: Type Casting
AnyObject 可以表示任何类类型的实例。
The Swift Programming Language: Classes and Structures
Swift 的 String、Array 和 Dictionary 类型都是作为结构实现的。
您可以为此使用Any?
。
var cars: [String: Any?] = [ "model": "Ferrari"]
var JSON: [String: Any?] = [ "cars": cars ]
再看这个之后,有一个微妙的问题导致它崩溃。
这是一个有效的示例:
var cars: [String: AnyObject] = [ "model": "Ferrari"]
var JSON: [String: AnyObject] = [ "cars": cars ]
之所以有效,是因为 cars
被强制(隐式转换)从 [String: AnyObject]
到与 NSDictionary ([AnyHashable: AnyObject])
兼容的对象。然后将此NSDictionary
兼容对象强制转换为AnyObject
。所以,魔法。
[String: AnyObject?]
不能这样转换,因为它不兼容NSDictionary
,所以强制失败。
【讨论】:
谢谢!这会影响我的对象向 NSDictionary 的投射吗? 你已经有问题了。NSDictionary
必须是 [NSObject: AnyObject]
。 [NSObject: AnyObject?]
不起作用。
修复了一个小错误 NSDictionary
被强制转换为 [AnyHashable: AnyObject]
。【参考方案2】:
好像汽车不是 AnyObject?
您将cars
定义为[String: AnyObject?]
类型,因此,以下代码有效(在 Playground 中测试):
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: [String: AnyObject?]] = [ "cars": cars ]
只有当您无法猜测cars
将是什么类型时,您才应该将JSON
定义为[String: AnyObject?]
或[String: Any?]
类型(根据您的需要)(请参阅Swift 中的Type Casting for Any and AnyObject编程语言)。
这会影响我的对象向 NSDictionary 的转换吗?
NSDictionary
无法容纳 nil
(请参阅 here 或 here)。以下代码在 Playground 中给出错误消息:
var nsDict1: NSDictionary = [12 : 10, 10 : nil] //eror message
var cars: [String: AnyObject?] = [ "model" : nil]
var JSON: [String: [String: AnyObject?]] = [ "cars" : cars ]
let nsDict2 = JSON as NSDictionary //error message
但是,下面的代码是有效的:
var nsDict1: NSDictionary = [12 : 10, 10 : NSNull()] //no error message
var cars: [String: AnyObject] = [ "model" : "Ferrari"] //also works with [ "model" : NSNull()]
var JSON: [String: [String: AnyObject]] = [ "cars" : cars ]
let nsDict2 = JSON as NSDictionary //no error message
【讨论】:
>NSDictionary 不能保持零。一定要记住。以上是关于类型 '[String, AnyObject?]' 不符合协议 AnyObject?:为啥?的主要内容,如果未能解决你的问题,请参考以下文章
类型'[String,AnyObject?]'不符合协议AnyObject?:为什么?
类型 [String: String] 不符合协议 'AnyObject'
无法将 '[String : AnyObject]?.Type' 类型(又名 'Optional<Dictionary<String, AnyObject>>.Type)的值转
类型'(String,AnyObject)'在swift中没有下标成员
无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”