當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Swift AnyObject用法及代碼示例

類型別名

AnyObject

所有類都隱式遵循的協議。

聲明

typealias AnyObject

詳述

當您需要無類型對象的靈活性或使用返回無類型結果的橋接 Objective-C 方法和屬性時,可以使用 AnyObjectAnyObject 可用作任何類、類類型或class-only 協議的實例的具體類型。例如:


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 中的許多值類型都與 Objective-C 對應,例如 StringInt


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 的具體類型的對象保持特定的動態類型,並且可以使用 type-cast 運算符之一( asas?as! )轉換為該類型。

此示例使用條件向下轉換運算符 (as?) 有條件地將上麵聲明的 s 常量轉換為 Swift 的 String 類型的實例。


if let message = s as? String {
    print("Successful cast to String: \(message)")
}
// Prints "Successful cast to String: This is a bridged string."

如果您事先知道 AnyObject 實例具有特定類型,則可以使用無條件向下轉換運算符 (as!)。執行無效轉換會觸發運行時錯誤。


let message = s as! String
print("Successful cast to String: \(message)")
// Prints "Successful 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 符號可以分別作為隱式展開的可選方法和屬性使用。

此示例使用名為 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 。您可以使用可選鏈接在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() 是否存在,請在調用方法之前使用可選綁定。


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"

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 AnyObject。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。