成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何在Swift的Protocol中定義可選方法(譯)

番茄西紅柿 / 3628人閱讀

摘要:劣勢(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 */
}

優(yōu)勢(shì)

沒有牽扯到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”的作用。

劣勢(shì)

對(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 */
}

優(yōu)勢(shì)

不需要默認(rèn)實(shí)現(xiàn),通過@objc optional 關(guān)鍵字修飾就可以了。

劣勢(shì)

這樣只能是符合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

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<