这只有在您导入Foundation
时才有效,因为Swift在这种情况下会执行一些桥接到Objective-C
类型 - 类似于NSArray
的对象。
import Foundation
let numbers: AnyObject = [11, 22, 33]
numbers.dynamicType //_SwiftDeferredNSArray.Type
如果不导入Foundation
,那么你甚至不能进行分配(因为斯威夫特阵列是一个结构,而不是一个对象)。
let numbers: AnyObject = [11, 22, 33] // error: contextual type 'AnyObject' cannot be used with array literal
可以转换为Any
,虽然:
let numbers: Any = [11, 22, 33]
numbers.dynamicType // Array<Int>.Type
为什么会出现import Foundation
的伎俩?这是记录在AnyObject
类型描述:
/// When used as a concrete type, all known `@objc` methods and
/// properties are available, as implicitly-unwrapped-optional methods
/// and properties respectively, on each instance of `AnyObject`. For
/// example:
///
/// class C {
/// @objc func getCValue() -> Int { return 42 }
/// }
///
/// // If x has a method @objc getValue()->Int, call it and
/// // return the result. Otherwise, return nil.
这意味着,你甚至可以打电话给你的阵列上的方法不一定对NSArray
存在,但存在于Objective-C
世界,例如像:
numbers.lowercaseString // nil
和Swift将优雅地返回给您一个nil
值,而不是抛出一个令人讨厌的object does not recognises selector
异常,就像在Objective-C中发生的那样。如果这是好还是坏,还有待讨论上述:)
更新 似乎只能用于性质的工作,以及与财产等的方法,如果你尝试使用Objective-C的方法,那么你会碰上了无法识别的选择问题:
import Foundation
@objc class TestClass: NSObject {
@objc var someProperty: Int = 20
@objc func someMethod() {}
}
let numbers: AnyObject = [11, 22, 33]
numbers.lowercaseString // nil
numbers.someMethod // nil
numbers.someMethod() // unrecognized selector
numbers.stringByAppendingString("abc") // unrecognized selector
相关:http://stackoverflow.com/questions/24154304/why-is-an-array-an-anyobject-in-swift – dfri
的问题是非常有趣的了解幕后的事情,但相当理论。在实践中,你不会使用类型注释'AnyObject'作为编译器可以推断的正确类型的对象,而且你 - 开发人员 - 确切地知道。无论如何,Apple强烈建议不要使用(这样的)类型的注释。 – vadian
'NSJSONSerialization.JSONObjectWithData'返回'AnyObject' –