gpt4 book ai didi

swift - 如何在swift中调用协议(protocol)中的默认实现代码?

转载 作者:行者123 更新时间:2023-11-28 10:56:34 25 4
gpt4 key购买 nike

我已经在协议(protocol)扩展中给出了一些默认的实现代码。但是如何在确认协议(protocol)的类中调用此指定代码。这是一个例子:

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."

最佳答案

协议(protocol)更像是类型具有特定方法和属性的编译时保证。默认实现通过向协议(protocol)的采用者注入(inject)实现来为此增加了另一层复杂性。我不具备浏览 Swift 源代码的技能,但我认为当采用者提供自己的实现时,默认实现就会黯然失色,并且无法取回它。

解决方法是向您的协议(protocol)添加一个具有不同名称的方法,它提供默认实现并且可以被任何采用者调用:

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")
}
}

关于swift - 如何在swift中调用协议(protocol)中的默认实现代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43158837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com