【发布时间】:2014-07-05 15:40:13
【问题描述】:
In Swift documentation, it says the following:
Swift 提供了两个特殊的类型别名来处理非特定类型: AnyObject 可以表示任何类类型的实例。 Any 可以表示任何类型的实例,除了函数类型。 笔记 仅当您明确需要它们提供的行为和功能时才使用 Any 和 AnyObject。最好具体说明您希望在代码中使用的类型。
如果我理解正确的话,AnyObject应该在与类类型兼容的情况下使用,这意味着它不能代表Swift内置的String、Int、Dictionary、Array等。 .. 因为这些在 Swift 中都表示为结构,而不是类。
但是,当我编写以下代码时,它可以编译而没有任何错误:
var myInt: Int = 10
var myStr: String = "st"
var myDict:Dictionary<String, AnyObject> = ["k1": "1", "k2": 2, "k3": true]
var myArr:Array<AnyObject> = []
myArr.append(myInt)
myArr.append(myStr)
myArr.append(myDict)
println(myArr)
因为我将myArr定义为AnyObject[],所以它应该只能包含类类型,而myInt、myStr和myDict都兼容Any,而不是AnyObject,并且Any 与`AnyObject 不兼容。
但是,我认为它可以编译的原因是因为myInt 在内部可以转换为Objective-C 的NSInteger,这是AnyObject 的子类型。 String/NSString 和 Dictionary/NSDictionary 也是如此。我的猜测正确吗?然后,这是我的问题:
即使你可以将 Swift 的 Array 定义为
AnyObject并且仍然存储 Swift 的结构如Int或String,那么使用Any有什么意义呢?在任何情况下您必须将数组定义为Any?Dictionary的值类型呢?我应该如何决定何时使用
Any以及何时使用AnyObject,尤其是当我处理可以转换为Objective-C 对象的类型时,例如String、Int、Dictionary等?
我认为 Cocoa 和 Cocoa Touch 中的大多数方法返回 AnyObject!,而不是 Any!。所以我想知道在 Swift 的数组和字典的值类型中使用 Any 的最佳情况是什么。
【问题讨论】:
-
看起来这在种子 2 中发生了变化。我猜他们甚至不确定自己在做什么。
-
我使用 Xcode 6 Beta 2。我还添加了
import Foundation,但没有它,代码将被编译。
标签: ios objective-c swift