AnyObject
聲明
typealias AnyObject
詳述
當您需要無類型對象的靈活性或使用返回無類型結果的橋接 Objective-C 方法和屬性時,可以使用 AnyObject
。 AnyObject
可用作任何類、類類型或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 對應,例如 String
和 Int
。
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 運算符之一( as
、 as?
或 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"
可用版本
相關用法
- Swift AnySequence elementsEqual(_:)用法及代碼示例
- Swift AnyCollection min()用法及代碼示例
- Swift AnyBidirectionalCollection elementsEqual(_:)用法及代碼示例
- Swift AnyRandomAccessCollection randomElement(using:)用法及代碼示例
- Swift AnyBidirectionalCollection lexicographicallyPrecedes(_:)用法及代碼示例
- Swift AnyHashable ==(_:_:)用法及代碼示例
- Swift AnyBidirectionalCollection split(separator:maxSplits:omittingEmptySubsequences:)用法及代碼示例
- Swift AnyRandomAccessCollection first(where:)用法及代碼示例
- Swift AnyBidirectionalCollection sorted()用法及代碼示例
- Swift AnyRandomAccessCollection min()用法及代碼示例
- Swift AnySequence shuffled(using:)用法及代碼示例
- Swift AnyBidirectionalCollection shuffled(using:)用法及代碼示例
- Swift AnyRandomAccessCollection prefix(upTo:)用法及代碼示例
- Swift AnyBidirectionalCollection starts(with:)用法及代碼示例
- Swift AnyBidirectionalCollection contains(where:)用法及代碼示例
- Swift AnyCollection allSatisfy(_:)用法及代碼示例
- Swift AnyRandomAccessCollection prefix(through:)用法及代碼示例
- Swift AnyBidirectionalCollection suffix(from:)用法及代碼示例
- Swift AnyCollection compactMap(_:)用法及代碼示例
- Swift AnyHashable debugDescription用法及代碼示例
- Swift AnyIterator suffix(_:)用法及代碼示例
- Swift AnyIterator lexicographicallyPrecedes(_:)用法及代碼示例
- Swift AnySequence joined()用法及代碼示例
- Swift AnyRandomAccessCollection sorted()用法及代碼示例
- Swift AnyIterator sorted()用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 AnyObject。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。