类型'[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(见herehere)。以下代码在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)的值转

类型'(String,AnyObject)'在swift中没有下标成员