【问题标题】:Type '[String, AnyObject?]' does not conform to protocol AnyObject?: why?类型 '[String, AnyObject?]' 不符合协议 AnyObject?:为什么?
【发布时间】:2014-11-17 19:03:45
【问题描述】:

我试图了解为什么会出现编译错误:Type '[String, AnyObject?]' does not conform to protocol AnyObject?

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

看起来cars 不是AnyObject?我不明白。

感谢您的帮助!

【问题讨论】:

    标签: dictionary swift compiler-errors nsdictionary literals


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这会影响我的对象向 NSDictionary 的投射吗?
    • 你已经有问题了。 NSDictionary 必须是 [NSObject: AnyObject][NSObject: AnyObject?] 不起作用。
    • 修复了一个小错误 NSDictionary 被强制转换为 [AnyHashable: AnyObject]
    【解决方案2】:

    好像汽车不是 AnyObject?

    您将cars 定义为[String: AnyObject?] 类型,因此,以下代码有效(在 Playground 中测试):

    var cars: [String: AnyObject?] = [ "model": "Ferrari"]
    var JSON: [String: [String: AnyObject?]] = [ "cars": cars ]
    

    只有当您无法猜测cars 将是什么类型时,您才应该将JSON 定义为[String: AnyObject?][String: Any?] 类型(根据您的需要)(请参阅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
    

    【讨论】:

    • >NSDictionary 不能保持零。一定要记住。
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2015-01-02
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多