国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

番茄西紅柿 / 3619人閱讀

摘要:劣勢對于有返回值的函數,你需要返回一個合適的默認值,這并不總是可行的。至少沒有一個特殊的返回值來解決該問題。看一下下面的代碼如果你提供了一個返回值為的默認實現,乍一看這么做沒有問題。如果您經常調用可選方法,這可能會引入很多冗余代碼。

使用默認實現(推薦)

protocol MyProtocol {
    func doSomething()
}

extension MyProtocol {
    func doSomething() {
        /* return a default value or just leave empty */
    }
}

struct MyStruct: MyProtocol {
    /* no compile error */
}

優勢

沒有牽扯到OC的runtime(至少沒有明顯的用到)。這就意味著你的structs、enum、或者非繼承自NSObject的class去遵守它。此外,你還可以使用功能強大的泛型(generics) 。對泛型不了解的,可以通過這篇文章來了解泛型的基本使用。

當遇到符合此類protocol的類型時,你可以確保滿足所有要求。它始終是具體實現或默認實現,這就相當于其他語言的“interfaces”或“contracts”的作用。

劣勢

對于有返回值的函數,你需要返回一個合適的默認值,這并不總是可行的。但是,當你遇到了這個問題,就說明這個函數不應該聲明為可選的,或者你在設計API的時候犯錯了。

你無法區分是提供了一個默認的實現,還是并沒有實現。至少沒有一個特殊的返回值來解決該問題。看一下下面的代碼:

protocol SomeParserDelegate {
    func validate(value: Any) -> Bool
}

如果你提供了一個返回值為true的默認實現,乍一看這么做沒有問題。接下來考慮一下下面的偽代碼:

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

這時是無法實現優化這個分支(if)的,因為你無法知道你的delegate是否實現了這個方法。 雖然有很多方法可以解決這個問題(使用optional closures,不同的delegate對象用于不同的操作等等),這個例子只是清晰地說明這么做存在的問題。

使用@objc optional

@objc protocol MyProtocol {
    @objc optional func doSomething()
}

class MyClass: NSObject, MyProtocol {
    /* no compile error */
}

優勢

不需要默認實現,通過@objc optional 關鍵字修飾就可以了。

劣勢

這樣只能是符合OC中遵守protocol的類型,才能遵守該protocol,這樣嚴重限制了Protocol的功能。這就意味著只有繼承自NSObject的類才能遵守該協議。struct、enum都不行,也不能使用associated type。

你必須始終通過可選地調用或檢查符合類型是否實現它來檢查是否實現了可選方法。如果您經常調用可選方法,這可能會引入很多冗余代碼。

原文鏈接

How to define optional methods in Swift protocol);

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7069.html

相關文章

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<