![](/img/trans.png)
[英]How to make a protocol extend another protocol and provide default implementation for it in Swift?
[英]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.