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はObjective-Cのように厄介なobject does not recognises selector
例外をスローするのではなく、nil
という値を正常に返します。これが良いか悪いかである場合は、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'を返します –