iOS Swift 建立代理協議的多種方式

LinXunFeng發表於2019-03-02

假如有一個類為 LXFView,現在要為這個類建立一個代理協議,我們該如何做呢?

首先,代理協議的命名方式:類名 + Delegatev

protocol LXFViewDelegate {
    func view(_ view: LXFView)
}
複製程式碼

當我們建立的協議遵守其它協議的情況下,只是這樣寫並不會報錯,接下來我們在LXFView中新增一個代理屬性,為避免迴圈引用,代理屬性需要用weak修飾

class LXFPageView: UIView {
    
    weak var delegate: LXFViewDelegate?
    
}
複製程式碼

此時就報錯了,提示如下

`weak` may only be applied to class and class-bound protocol types, not `LXFViewDelegate`
複製程式碼
報錯

意思是weak只能修飾一個類或者類繫結協議的型別

正如提示一樣,我們當前的代理並非是一個類或者類繫結協議的型別
當前我們這個協議不僅可以被類遵守,還可以被結構體和列舉所遵守(這裡不演示了),這無法達到weak的要求,那怎麼辦呢?

解決辦法有兩個:

  • 辦法1

直接在協議的後面寫上【: class】或者【: NSObjectProtocol】

protocol LXFPageViewDelegate: class
// 或者
protocol LXFPageViewDelegate: NSObjectProtocol
複製程式碼
class

這種方式下推薦【: class】,相比之下更為輕量級

  • 辦法2
    在protocol前面加上【@objc】,表示objc型別的協議
@objc protocol LXFPageViewDelegate
複製程式碼
objc

這種方式下的優點是協議中的方法不強制實現

相關文章