Swift代理協議的安全使用

雅之道法自然發表於2018-10-25

文章

Swift代理協議的安全使用

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 程式碼

友情提示:

相關文章