簡體   English   中英

如何快速調用協議中的默認實現代碼?

[英]How the call the default implementation code in protocol in swift?

我在協議擴展中給出了一些默認的實現代碼。 但是如何在確認協議的類中調用此指定代碼。 這是一個例子:

class BaseClass {}
protocol ImplementedProtocol {
    func printInfo()
}
extension ImplementedProtocol where Self: BaseClass {
    func printInfo() {
        print("Hello! This is ImplementedProtocol")
    }
}

class SuperClass: BaseClass, ImplementedProtocol {
    func printInfo() {
        // I should do sth here.
        print("Hello! This is SuperClass")
    }
}
class SubClass: SuperClass {
    override func printInfo() {
        super.printInfo()
        print("This is SubClass")
    }

}

let a = SubClass()
a.printInfo() // I get "Here is SuperClass. Here is SubClass."
// But I want "Here is ImplementedProtocol. Here is SuperClass. Here is SubClass."

協議更像是編譯時保證類型具有某些方法和屬性的保證。 通過將實現注入協議的采用者,默認實現會為此增加另一層復雜性。 我沒有掌握Swift的源代碼的技能,但是我認為當采用者提供其自己的實現時,默認實現被遮蓋了,無法將其取回。

一種解決方法是在協議中添加一個具有不同名稱的方法,該方法提供默認實現,並且可以由任何采用者調用:

protocol ImplementedProtocol {
    func printInfo()

    func defaultPrintInfo()
}

extension ImplementedProtocol where Self: BaseClass {
    func printInfo() {
        defaultPrintInfo()
    }

    func defaultPrintInfo() {
        print("Hello! This is ImplementedProtocol")
    }
}

class SuperClass: BaseClass, ImplementedProtocol {
    func printInfo() {
        self.defaultPrintInfo()
        print("Hello! This is SuperClass")
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM