在编写用于delegate的protocol的时候,编译器经常会提示'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方法和属性
- 对于所有Class的oc的实例方法或属性,
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
但不建议这样用,因为相比
AnyObject,AnyClass从名字上来看,更适合用作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 {}
算不上的总结
- 可以看出,
AnyObject和AnyClass都只和Class相关