为什么在Swift中数组是AnyObject类型?

6

我有些难以理解AnyObject的限制。

从头文件可以看出,Array是一个结构体。尽管如此,以下代码仍然有效:

var whatobject : AnyObject
whatobject = [1,2]

不仅仅是文字数组:

并且这也不只是针对文字数组的情况:
var whatobject : AnyObject
let arr = [1,2,3]
whatobject = arr

然而,我无法将自己创建的结构体赋值给whatobject

struct S {}
var whatobject : AnyObject
whatobject = S() // error

所以,数组毕竟不是结构体吗?
1个回答

8
这就是桥接的有趣之处... 默认情况下,Swift会进行以下桥接:
- 将Int(以及相关类型)转换为NSNumber - 将String转换为NSString - 将Dictionary转换为NSDictionary 如果需要,编译器会将它们转换为对象。您也可以这样做:
var num : AnyObject = 1 // I think num is now NSNumber
var arr : AnyObject = [1,2,3] // I think arr is now NSArray of @[@1,@2,@3]

你不能把struct / enum 赋值给 AnyObject,因为它们不是对象类型(你可以使用Any来保存它们)。

哇,我之前确实没有想过这个! - matt
1
我希望苹果能够改变这种自动桥接的行为。它引入了很多难以发现的错误。 - Bryan Chen
我在Playground中输入你的代码时,出现了类型转换错误的报错信息。 - BergQuester
@BryanChen 你可以为你的泛型函数添加类型约束来帮助解决这个问题。 - Nate Cook
Playground执行失败:错误:<REPL>:363:23:错误:无法将表达式的类型“Int”转换为类型“AnyObject” var num: AnyObject = 1 // 我认为num现在是NSNumber ^ <REPL>:364:23:错误:无法将表达式的类型“Array”转换为类型“IntegerLiteralConvertible” var arr: AnyObject = [1,2,3] // 我认为arr现在是NSArray,包含@[@1,@2,@3] - BergQuester
显示剩余5条评论

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