Swift 標準ライブラリ   >     AnyObject
プロトコル
AnyObject
すべてのクラスが暗黙的に準拠するプロトコル。
概観
型指定されていないオブジェクトの柔軟性が必要な場合や、型指定されていない結果を返すブリッジされた Objective-C のメソッドとプロパティを使用する場合は、AnyObject を使用して下さい。AnyObject は、クラス、クラス型、またはクラスのみのプロトコルのインスタンスの具体的な型として使用できます。例えば:
class FloatRef { let value: Float init(_ value: Float) { self.value = value } } let x = FloatRef(2.3) let y: AnyObject = x let z: AnyObject = FloatRef.self
AnyObject は、Objective-C クラスにブリッジする型のインスタンスの具体的な型として使用することもできます。Swift がブリッジする多くの値型は、String や Int のように Objective-C と同等のものです。
let s: AnyObject = "This is a bridged string." as NSString print(s is NSString) // Prints "true" let v: AnyObject = 100 as NSNumber print(type(of: v)) // Prints "__NSCFNumber"
AnyObject プロトコルの柔軟な動作は、Objective-C の id 型に似ています。このため、インポートされた Objective-C 型では、プロパティ、メソッド、パラメータ、および戻り値の型として AnyObject が頻繁に使用されます。
AnyObject インスタンスを既知の型にキャストする
AnyObject の具体的な型を持つオブジェクトは、特定の動的型を維持し、型キャスト演算子の 1 つを使用してその型にキャストできます(as,as?,または as!)。
この例では、条件付きダウンキャスト演算子(as?) を使用して、上で宣言した s 定数を Swift の String 型のインスタンスに条件付きキャストします。
if let message = s as? String { print("Succesful cast to String: \(message)") } // Prints "Succesful cast to String: This is a bridged string."
AnyObject インスタンスが特定の型が持つことを事前に知っている場合は、無条件ダウンキャスト演算子(as!)を使用できます。無効なキャストを実行すると、実行時エラーが発生します。
let message = s as! String print("Succesful cast to String: \(message)") // Prints "Succesful cast to String: This is a bridged string." let badCase = v as! String // Runtime error
キャストは switch 文の文脈では常に安全です。
let mixedArray: [AnyObject] = [s, v] for object in mixedArray { switch object { case let x as String: print("'\(x)' is a String") default: print("'\(object)' is not a String") } } // Prints "'This is a bridged string.' is a String" // Prints "'100' is not a String"
Objective-C のメソッドとプロパティへのアクセス
AnyObject を具体的な型として使用する場合、全ての @objc のメソッドとプロパティ、つまり Objective-C からインポートされたメソッドやプロパティ、@objc 属性でマークされたものをすべて自由に使用できます。Swift はコンパイル時に、これらのメソッドとプロパティが実際に AnyObject インスタンスの基底型で使用可能であることを保証できないため、これらの @objc シンボルは、暗黙的に開封された optional のメソッドとプロパティとしてそれぞれ使用できます。
この例では、getIntegerValue() という @objc メソッドを使用して IntegerRef 型を定義しています。
class IntegerRef { let value: Int init(_ value: Int) { self.value = value } @objc func getIntegerValue() -> Int { return value } } func getObject() -> AnyObject { return IntegerRef(100) } let obj: AnyObject = getObject()
この例では、obj には静的型 AnyObject と動的型の IntegerRef があります。optional の連鎖を使用して、obj の @objc メソッド getIntegerValue() を安全に呼び出すことができます。動的な型の obj が確実なら、getIntegerValue() を直接呼び出すことができます。
let possibleValue = obj.getIntegerValue?() print(possibleValue) // Prints "Optional(100)" let certainValue = obj.getIntegerValue() print(certainValue) // Prints "100"
動的な型の obj が getIntegerValue() メソッドを実装していない場合、certainValue を初期化すると、システムは実行時エラーを返します。
また、obj.getIntegerValue() が存在するかどうかをテストする必要がある場合は、メソッドを呼び出す前に Optional の結合を使用してください。
if let f = obj.getIntegerValue { print("The value of 'obj' is \(f())") } else { print("'obj' does not have a 'getIntegerValue()' method") } // Prints "The value of 'obj' is 100"
以下も見よ
関連したシンボル
AnyClass