Objective-C協議遵守NSObject協議的原因

來自我的個人博客Minecode.link

今天將用OC寫的框架遷移至Swift時,發現OC寫的協議都遵守了NSObject,而在Swift中沒有此協議。所以記錄一下這個問題的原因:

在Objective-C 2.0之後,方法修飾符有@required和@optional(新增),也就是說增加了可選方法。對應的,也就需要在調用代理方法之前判斷其是否被實現。也就是我們熟悉的如下寫法:

if (self.delegate != nil && [self.delegate respondsToSelector:@selector(protocolFunc)]) {
    [self.delegate protocolFunc];
}

NSObject的協議主要定義了以下幾個常見方法:

  • - (BOOL)isKindOfClass:(Class)aClass;
  • - (BOOL)isMemberOfClass:(Class)aClass;
  • - (BOOL)conformsToProtocol:(Protocol *)aProtocol;
  • - (BOOL)respondsToSelector:(SEL)aSelector;
  • etc…

這就是爲什麼我們需要繼承NSObject。
而Swift語言爲我們提供了可選項,保證了調用的安全性,所以我們可以按如下方法使用:

// 定義協議
@objc protocol MCTestViewDelegate: class {
    @objc func testViewNeedsOperate()
    @objc optional func testViewDidUpdate()
}

/* ... */

// 判斷是否遵守協議並調用
if let delegate = testView is MCTestViewDelegate {
    delegate.testViewNeedsOperate()
}

// 判斷代理對象是否實現該代理方法
if (delegate as? MCTestViewDelegate)?.testViewDidUpdate != nil {
    // 處理...
}

// 一句話實現
(delegate as? MCTestViewDelegate)?.testViewDidUpdate?()

通過可選項的判斷,即可輕鬆判斷方法/協議是否實現,減少了代碼量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章