当前位置: 首页 > 面试题库 >

为什么整数不符合AnyObject协议?

程志新
2023-03-14
问题内容

为什么我要有一个[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可以代表任何类类型的实例”

但是,当我命令点击IntInt32或者Int64看到这些类型的标准库定义,我看到他们都struct值。

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


问题答案:

Swift中有两种类型的东西- Any可以真正容纳任何东西-结构,枚举或类,以及AnyObject只能容纳类。

AnyObject有时似乎可以保留结构的原因是,某些特定类型会根据需要隐式转换为它们的NSE等效项,以减少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)

可以争论的是,应该有更多的隐式转换来润滑轮子,但是这些隐式转换又是造成很多混乱的根源,而最新Beta版中的方向是减少它们而不是增加它们。



 类似资料:
  • 问题内容: 编译错误如下: 类型“ AnyObject”不符合协议“ SequenceType” 这种压力是什么? 谁能帮我很多忙! 问题答案: 苹果在Swift编程语言中指出: for-in循环针对范围,序列,集合或进度中的每个项目执行一组语句。 目前,它仅符合protocol ,因此您无法在其上使用for循环。如果要这样做,则必须执行类似以下操作:

  • 问题内容: 我正在使用Swift 2,并使用WeakContainer作为存储一组弱对象的方法,就像 然后在我的ViewController中,声明 但这是错误的 不支持将MyDelegate用作符合协议AnyObject的具体类型 我看到错误是成员已声明为,因此应该是对象。但是我也声明为。如何解决这个问题? 问题答案: 我有相同的想法,用泛型创建弱容器。 结果,我为创建了包装器,并为您的编译器错

  • 问题内容: 我在AppDelegate中,尝试传递对WatchKit扩展请求的答复。我不能使用枚举数组作为其值键入为AnyObject的Dictionary中的值。在操场上进行实验显示: 当然,可以通过将枚举转换为字符串或数字来解决此问题,但是为什么这在Swift中是类型错误? 问题答案: 为了与Objective-C兼容而存在。您只能将对象放入Objective- C可以解释的数组中。Swift

  • 问题内容: 我无法理解AnyObject的局限性。 您可以从标题中看到Array是一个结构。但是,此代码有效: 而且不只是文字数组: 但是,我不能为我分配一个结构: 那么,数组毕竟不是真正的结构吗? 问题答案: 这是桥接出现时最有趣的部分… 默认情况下,Swift bridge (和朋友) 至 至 因此,如果需要,编译器会将它们更改为对象 你可以做 并且您不能将/ 分配给,因为它们不是对象类型(可

  • 问题内容: 我试图在我快速编写的类上使用NSCoding协议,但是似乎无法弄清楚为什么当我实现所需的方法时,编译器会抱怨它“不符合协议NSCoding”: 这是一个错误还是我只是缺少一些东西? 问题答案: 如您在报告导航器中详细的编译器消息中所见,您的方法未正确声明: (在beta版本之间可能有所变化。)此外,该方法必须标记为: 在 Swift 3中 ,所需的方法是

  • 问题内容: 为什么此Swift代码无法编译? 编译器说:“类型不符合协议”(或在Swift的更高版本中,“不支持将’P’用作符合协议’P’的具体类型”。) 为什么不?某种程度上,这感觉就像是语言上的一个漏洞。我意识到问题源于将数组声明为 协议类型 的数组,但这是不合理的事情吗?我认为协议确实可以帮助提供类型分层结构之类的结构吗? 问题答案: 编辑:使用Swift还要工作18个月,Swift是另一个