类型'[String,AnyObject?]'不符合协议AnyObject?:为什么?

问题描述 投票:15回答:2

我试图理解为什么我有编译错误:类型'[String,AnyObject?]'不符合协议AnyObject?

var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ]  // <-- error

似乎cars不是AnyObject?我不明白。

谢谢你的帮助!

dictionary swift compiler-errors nsdictionary literals
2个回答
24
投票

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,因此强制失败。


3
投票

看起来汽车不是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
© www.soinside.com 2019 - 2024. All rights reserved.