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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。