文章
Swift代理協議的安全使用
概述
在Swift下,使用代理協議,並且檢驗代理物件的存在和協議函式是否被實現。
前言
可空鏈式呼叫(Optional Chaining)是一種可以請求和呼叫屬性、方法及下標的過程,它的可空性體現於請求或呼叫的目標當前可能為空(nil)。如果可空的目標有值,那麼呼叫就會成功;如果選擇的目標為空(nil),那麼這種呼叫將返回空(nil)。多個連續的呼叫可以被連結在一起形成一個呼叫鏈,如果其中任何一個節點為空(nil)將導致整個鏈呼叫失敗。
注意: Swift 的可空鏈式呼叫和 Objective-C 中的訊息為空有些相像,但是 Swift 可以使用在任意型別中,並且能夠檢查呼叫是否成功。
空鏈式(Optional Chaining)的使用之一
在Swift中空鏈式的有個實用例子,就是編寫代理的時候。當觸發協議方法的時候,因為OC是訊息型語言,所以必須要判斷這個例項是否存在並且要判斷當前方法是否被實現,不然沒有實現的話,Runtime期間,就可能會報錯。又因為OC幾乎所以的類都是繼承基類NSObject,而根類NSObject
實現了其協議NSObject
的協議方法respondsToSelector:
,該方法可以判斷某個方法實現的。如下
// 判斷新增了代理物件,並且該物件實現了某個協議方法
if (self.delegate && [self.delegate respondsToSelector:@selector(protocalMethod)]) {
[self.delegate protocalMethod];
}
複製程式碼
而在Swift語言中,並未要求繼承某個根類。並且也未提供某個方法去不判斷某個方法是否被實現。其實因為Swift的語言一個特性--可選性,就很好解決這些問題了。正如上方的描述,如果其中任何一個節點為空(nil)將導致整個鏈呼叫失敗。如下
self.delegate?.SwiftProtocolTest?()
複製程式碼
當判讀使用有代理物件的時候,只需在屬性delegate
新增"?"就行,而需要判斷某個函式是否實現只需在函式名和()之間新增"?"就行。
提示:本文delegate在Swift和OC的對比可以檢視 github 程式碼
友情提示: