关于协议
2023-05-04 本文已影响0人
邢罗康
协议(Protocol)
-
AnyObject、class
Runnable1、Runnable2都是只能被类遵守的协议
protocol Runnable1: AnyObject {}
protocol Runnable2: class {}
-
@objc
下面定义的协议是被@objc修饰的协议,可以暴露给OC去遵守实现
@objc protocol Runnable {}
-
@objc optional
可以通过@objc optional定义可选协议,这种协议只能被类遵守,如下:
@objc protocol Runnable {
func run1()
@objc optional func run2()
func run3()
}
class Dog: Runnable {
func run3() { print("Dog run3") }
func run1() { print("Dog run1") }
}
var d = Dog()
d.run1() // Dog run1
d.run3() // Dog run3
-
@objc dynamic
被@objc dynamic修饰的内容会具有动态性,比如调用方法会走Runtime那一套流程
class Dog: NSObject {
@objc dynamic func test1() {}
func test2() {}
}
var d = Dog()
d.test1() // test1走的是objc_msgSend
d.test2() // test2走的是Swift虚表那一套
-
总结:
- ① 以前我们说过,可以给协议添加扩展,在扩展里面提供协议的默认实现,这样间接实现可选协议的效果。
- ② 可以通过
@objc optional定义可选协议,这种协议只能被类遵守,可以暴露给OC去遵守实现。