类型'[String,AnyObject?]'不符合协议AnyObject?:为什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类型'[String,AnyObject?]'不符合协议AnyObject?:为什么?相关的知识,希望对你有一定的参考价值。
我试图理解为什么我有编译错误:类型'[String,AnyObject?]'不符合协议AnyObject?
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ] // <-- error
似乎cars
不是AnyObject?我不明白。
谢谢你的帮助!
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
,因此强制失败。
看起来汽车不是AnyObject?
您将cars
定义为[String: AnyObject?]
类型,因此,以下代码有效(在Playground中测试):
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: [String: AnyObject?]] = [ "cars": cars ]
你应该定义JSON
类型为[String: AnyObject?]
或[String: Any?]
(根据你的需要),只有你不能猜出cars
将是什么类型(参见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
以上是关于类型'[String,AnyObject?]'不符合协议AnyObject?:为什么?的主要内容,如果未能解决你的问题,请参考以下文章
尝试修复 Swift 3 错误;无法使用“String”类型的索引为“[[String:AnyObject]]”类型的值下标[关闭]
类型 '[String, AnyObject?]' 不符合协议 AnyObject?:为啥?
找不到接受类型参数列表的 XCTAssertEqual 的重载 ([String : AnyObject], [String : AnyObject])
类型 [String: String] 不符合协议 'AnyObject'
无法将 '[String : AnyObject]?.Type' 类型(又名 'Optional<Dictionary<String, AnyObject>>.Type)的值转