我试图理解为什么我有一个编译错误:Type '[String, AnyObject?]' does not conform to protocol AnyObject?
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ] // <-- error
似乎cars
不是AnyObject类型?我不理解这一点。
谢谢你的帮助!
我试图理解为什么我有一个编译错误:Type '[String, AnyObject?]' does not conform to protocol AnyObject?
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ] // <-- error
似乎cars
不是AnyObject类型?我不理解这一点。
谢谢你的帮助!
AnyObject
必须是一个类,但Dictionary
是一个结构体。
AnyObject
可以表示任何类类型的实例。
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
被强制转换(隐式转换)为与NSDictionary ([AnyHashable: AnyObject])
兼容的对象。然后将此NSDictionary
兼容对象转换为AnyObject
。所以,这就是魔术。
[String: AnyObject?]
无法以这种方式进行强制转换,因为它不兼容NSDictionary
,所以强制转换失败。
看起来汽车不是AnyObject类型?
您将cars
定义为[String: AnyObject?]
类型,因此,以下代码是有效的(在Playground中测试):
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: [String: AnyObject?]] = [ "cars": cars ]
cars
的类型(参见The Swift Programming Language中的Any和AnyObject的类型转换),那么你应该将JSON
定义为[String: AnyObject?]
或[String: Any?]
,具体取决于你的需求。
这样会影响我将对象强制转换为NSDictionary吗?
NSDictionary
不能存储nil
(请参考这里或这里)。以下代码在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
必须是[NSObject: AnyObject]
,[NSObject: AnyObject?]
是不可行的。 - Jeffery ThomasNSDictionary
强制转换为[AnyHashable: AnyObject]
。 - Jeffery Thomas