当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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