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

15

我试图理解为什么我有一个编译错误:Type '[String, AnyObject?]' does not conform to protocol AnyObject?

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

似乎cars不是AnyObject类型?我不理解这一点。

谢谢你的帮助!

2个回答

24

AnyObject必须是一个类,但Dictionary是一个结构体。

Swift编程语言:类型转换

AnyObject可以表示任何类类型的实例。

Swift编程语言:类和结构体

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,所以强制转换失败。


谢谢!这会影响我将对象转换为NSDictionary吗? - Kamchatka
你已经遇到了一个问题。NSDictionary 必须是 [NSObject: AnyObject][NSObject: AnyObject?] 是不可行的。 - Jeffery Thomas
修复了一个小错误,将 NSDictionary 强制转换为 [AnyHashable: AnyObject] - Jeffery Thomas

3

看起来汽车不是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 不能存储 nil。 必须记住这一点。 - RustamG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接