AnyObject备忘

1,859 阅读1分钟

在编写用于delegateprotocol的时候,编译器经常会提示'weak' must not be applied to non-class-bound 'delegate'; consider adding a protocol conformance that has a class bound

The Swift Programming Language中有提到,如果要限制protocol为Class Only,可以遵循AnyObject

AnyObject和AnyClass的用法,貌似只能靠记忆了,并没有什么可以理解的东西

AnyObject

class Person {
}

class FloatRef {
    let value: Float
    init(_ value: Float) {
        self.value = value
    }
    
    @objc func getFloatValue() -> Float {
        return value
    }
    
    @objc class func floatRefClassFunction() {
        print("floatRefClassFunction")
    }
}

可以表示任何Class类型的实例

let x = FloatRef(2.3)
let y: AnyObject = x

AnyObject对象可以访问所有Class实例OC方法和属性

  • 对于所有Classoc的实例方法或属性,AnyObject对象都可以访问到
  • 比如标记了@objc的方法、属性,或者从OC的API中迁移到Swift中的
  • 虽然能访问到,但由于编译器无法在编译期间确定哪些Class真正实现了方法,所以在调用时api是implicitly unwrapped optional
let person: AnyObject = Person()
let optionalFunction = person.getFloatValue
print(optionalFunction) //nil
let  person.getFloatValue() //runtime error

AnyClass

typealias AnyClass = AnyObject.Type

和AnyObject类似,对于所有Class的oc的类方法或属性AnyClass变量都可以访问到

AnyObject可以表示任何Class类型的类型

let z: AnyObject = FloatRef.self

但不建议这样用,因为相比AnyObjectAnyClass从名字上来看,更适合用作Class类型的类型

let anyObject: AnyObject = FloatRef.self
let anyClass: AnyClass = FloatRef.self
anyClass.floatRefClassFunction()
anyObject.floatRefClassFunction()// error, anyObject无法访问到floatRefClassFunction方法

遵循AnyObject的Protocol会将protocol限制为Class Only

protocol WeakDelegate: AnyObject {}

算不上的总结

  • 可以看出,AnyObjectAnyClass只和Class相关

参考