協(xié)議(Protocol)
-
AnyObject、class
Runnable1、Runnable2都是只能被類遵守的協(xié)議
protocol Runnable1: AnyObject {}
protocol Runnable2: class {}
-
@objc
下面定義的協(xié)議是被@objc修飾的協(xié)議,可以暴露給OC去遵守實(shí)現(xiàn)
@objc protocol Runnable {}
-
@objc optional
可以通過@objc optional定義可選協(xié)議,這種協(xié)議只能被類遵守,如下:
@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修飾的內(nèi)容會具有動態(tài)性,比如調(diào)用方法會走Runtime那一套流程
class Dog: NSObject {
@objc dynamic func test1() {}
func test2() {}
}
var d = Dog()
d.test1() // test1走的是objc_msgSend
d.test2() // test2走的是Swift虛表那一套
-
總結(jié):
- ① 以前我們說過,可以給協(xié)議添加擴(kuò)展,在擴(kuò)展里面提供協(xié)議的默認(rèn)實(shí)現(xiàn),這樣間接實(shí)現(xiàn)可選協(xié)議的效果。
- ② 可以通過
@objc optional定義可選協(xié)議,這種協(xié)議只能被類遵守,可以暴露給OC去遵守實(shí)現(xiàn)。