摘要:劣勢(shì)對(duì)于有返回值的函數(shù),你需要返回一個(gè)合適的默認(rèn)值,這并不總是可行的。至少?zèng)]有一個(gè)特殊的返回值來解決該問題。看一下下面的代碼如果你提供了一個(gè)返回值為的默認(rèn)實(shí)現(xiàn),乍一看這么做沒有問題。如果您經(jīng)常調(diào)用可選方法,這可能會(huì)引入很多冗余代碼。
使用默認(rèn)實(shí)現(xiàn)(推薦)
protocol MyProtocol {
func doSomething()
}
extension MyProtocol {
func doSomething() {
/* return a default value or just leave empty */
}
}
struct MyStruct: MyProtocol {
/* no compile error */
}
沒有牽扯到OC的runtime(至少?zèng)]有明顯的用到)。這就意味著你的structs、enum、或者非繼承自NSObject的class去遵守它。此外,你還可以使用功能強(qiáng)大的泛型(generics) 。對(duì)泛型不了解的,可以通過這篇文章來了解泛型的基本使用。
當(dāng)遇到符合此類protocol的類型時(shí),你可以確保滿足所有要求。它始終是具體實(shí)現(xiàn)或默認(rèn)實(shí)現(xiàn),這就相當(dāng)于其他語言的“interfaces”或“contracts”的作用。
對(duì)于有返回值的函數(shù),你需要返回一個(gè)合適的默認(rèn)值,這并不總是可行的。但是,當(dāng)你遇到了這個(gè)問題,就說明這個(gè)函數(shù)不應(yīng)該聲明為可選的,或者你在設(shè)計(jì)API的時(shí)候犯錯(cuò)了。
你無法區(qū)分是提供了一個(gè)默認(rèn)的實(shí)現(xiàn),還是并沒有實(shí)現(xiàn)。至少?zèng)]有一個(gè)特殊的返回值來解決該問題??匆幌孪旅娴拇a:
protocol SomeParserDelegate { func validate(value: Any) -> Bool }
如果你提供了一個(gè)返回值為true的默認(rèn)實(shí)現(xiàn),乍一看這么做沒有問題。接下來考慮一下下面的偽代碼:
final class SomeParser {
func parse(data: Data) -> [Any] {
if /* delegate.validate(value:) is not implemented */ {
/* parse very fast without validating */
} else {
/* parse and validate every value */
}
}
}
這時(shí)是無法實(shí)現(xiàn)優(yōu)化這個(gè)分支(if)的,因?yàn)槟銦o法知道你的delegate是否實(shí)現(xiàn)了這個(gè)方法。 雖然有很多方法可以解決這個(gè)問題(使用optional closures,不同的delegate對(duì)象用于不同的操作等等),這個(gè)例子只是清晰地說明這么做存在的問題。
使用@objc optional
@objc protocol MyProtocol {
@objc optional func doSomething()
}
class MyClass: NSObject, MyProtocol {
/* no compile error */
}
不需要默認(rèn)實(shí)現(xiàn),通過@objc optional 關(guān)鍵字修飾就可以了。
這樣只能是符合OC中遵守protocol的類型,才能遵守該protocol,這樣嚴(yán)重限制了Protocol的功能。這就意味著只有繼承自NSObject的類才能遵守該協(xié)議。struct、enum都不行,也不能使用associated type。
你必須始終通過可選地調(diào)用或檢查符合類型是否實(shí)現(xiàn)它來檢查是否實(shí)現(xiàn)了可選方法。如果您經(jīng)常調(diào)用可選方法,這可能會(huì)引入很多冗余代碼。
原文鏈接
How to define optional methods in Swift protocol);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7069.html
閱讀 736·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6183·2021-11-29 11:00