來自我的個人博客Minecode.link
今天將用OC寫的框架遷移至Swift時檬姥,發(fā)現(xiàn)OC寫的協(xié)議都遵守了NSObject亿傅,而在Swift中沒有此協(xié)議璧针。所以記錄一下這個問題的原因:
在Objective-C 2.0之后大诸,方法修飾符有@required和@optional(新增)匕争,也就是說增加了可選方法避乏。對應(yīng)的,也就需要在調(diào)用代理方法之前判斷其是否被實現(xiàn)甘桑。也就是我們熟悉的如下寫法:
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(protocolFunc)]) {
[self.delegate protocolFunc];
}
NSObject的協(xié)議主要定義了以下幾個常見方法:
- - (BOOL)isKindOfClass:(Class)aClass;
- - (BOOL)isMemberOfClass:(Class)aClass;
- - (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- - (BOOL)respondsToSelector:(SEL)aSelector;
- etc...
這就是為什么我們需要繼承NSObject拍皮。
而Swift語言為我們提供了可選項歹叮,保證了調(diào)用的安全性,所以我們可以按如下方法使用:
// 定義協(xié)議
@objc protocol MCTestViewDelegate: class {
@objc func testViewNeedsOperate()
@objc optional func testViewDidUpdate()
}
/* ... */
// 判斷是否遵守協(xié)議并調(diào)用
if let delegate = testView is MCTestViewDelegate {
delegate.testViewNeedsOperate()
}
// 判斷代理對象是否實現(xiàn)該代理方法
if (delegate as? MCTestViewDelegate)?.testViewDidUpdate != nil {
// 處理...
}
// 一句話實現(xiàn)
(delegate as? MCTestViewDelegate)?.testViewDidUpdate?()
通過可選項的判斷春缕,即可輕松判斷方法/協(xié)議是否實現(xiàn)盗胀,減少了代碼量。