來自我的個人博客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?()
通過可選項的判斷,即可輕松判斷方法/協議是否實現,減少了代碼量。