【问题标题】:Why do integers not conform to the AnyObject protocol?为什么整数不符合 AnyObject 协议?
【发布时间】:2015-03-07 21:31:16
【问题描述】:

为什么我可以有一个[AnyObject] 数组并在其中放入一堆不同大小的类型...

var a = [AnyObject]()
a.append(Int(1))
a.append(Float64(3.14))
a.append(Bool(true))

...除了Int32Int64 ....

a.append(Int32(1)) // err: type 'Int32' does not conform to protocol 'AnyObject'
a.append(Int64(1)) // err: type 'Int64' does not conform to protocol 'AnyObject'

AnyObject 的文档说:

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

但是当我通过命令单击IntInt32Int64 来查看这些类型的标准库定义时,我看到它们都是struct 值。

这里的根本问题是什么?为什么会这样设计?

【问题讨论】:

    标签: swift


    【解决方案1】:

    在 Swift 中有两种任何类型——Any,它可以真正保存任何东西——结构、枚举或类,以及AnyObject,它只能保存类。

    AnyObject 有时可以保存结构的原因是某些特定类型会根据需要为您隐式转换为它们的 NSEquivalent,以减少 Objective-C 互操作的痛苦。

    当您编写let ao: AnyObject = Int(1) 时,并不是真的Int 放入AnyObject。相反,它会将您的 Int 隐式转换为 NSNumber,这是一个类,然后将其放入。

    但只有某些类型具有这种隐式转换。 Int 会,但Int32 不会,因此会出现这种行为:

    // fine
    let aoInt: AnyObject = Int(1) as NSNumber
    // also fine: implicit conversion
    let aoImplicitInt: AnyObject = Int(1)
    // not fine: error: 'Int32' is not convertible to 'NSNumber'
    let aoInt32: AnyObject = Int32(1) as NSNumber
    // but the implicit error is less, ahem, explicit
    // error: type 'Int32' does not conform to protocol 'AnyObject'
    let aoImplicitInt32: AnyObject = Int32(1)
    

    可以说应该有更多的隐式转换来润滑车轮,但话又说回来,这些隐式转换已经是很多混乱的根源,而最新测试版的方向是更少而不是更多。

    【讨论】:

    • 谢谢,这是一个很好的答案。你知道是否有任何关于 Swift 进行什么样的隐式转换的文档?我认为这不仅仅是NSInteger
    • 是的,它包含在Using Swift with Cocoa and Objective-C iBook 中。但请注意,它在 Xcode 6.3 测试版中发生了更改,并且本书仅反映了发布版本的行为,因此最好在尝试升级时查看 Xcode 发布说明。
    • 顺便说一句,您的意思是 NSNumber 而不是我假设的 NSInteger?
    【解决方案2】:

    赋予 Int 等人这种能力的协议是 _ObjectiveCBridgeable,如果你喜欢冒险的话,you can adopt yourself

    【讨论】:

    • 这应该是评论
    • 信誉不足。另外,它似乎回答了这个问题?
    【解决方案3】:

    因为 Int 是一个值类型。

    AnyObject 指的是引用类型(类)而不是值类型

    Any 指的是引用类型 + 值类型(结构+类)

    你必须对 valueTypes 使用 Any,而不是 AnyObject

    值类型> 一般是结构体、枚举、bla bla..

    引用类型 > 一般类

    变量有两种类型>引用类型和值类型

    引用类型是指针类型,一般包含一个存储原始数据的ram地址值

    值类型不是地址。它们直接包含变量值

    int asd = 3(asd直接包含3)

    Int、Float、数字类型……在大多数计算机语言中,日期几乎总是结构(值类型)。

    字符串几乎总是在大多数计算机语言中的混合体

    ViewControllers、Views、Buttons、...数组、字典...以及您自定义的类都是引用类型

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 1970-01-01
      • 2014-10-23
      • 2015-01-02
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多