gpt4 book ai didi

swift - 可以使用 Swift 中的实现者定义的功能扩展协议(protocol)吗?

转载 作者:行者123 更新时间:2023-12-05 02:50:33 25 4
gpt4 key购买 nike

示例:

Playground :github

protocol A: class {}

extension A {
func someFunc() {
print("1")
}
}

class B {
weak var delegate: A?

func someTrigger() {
delegate?.someFunc()
}
}

class C: A {
lazy var b: B = {
let b = B()
b.delegate = self
return b
}()

func someFunc() {
print("2")
}

init() {
b.someTrigger()
}
}

let c = C()
/// printed 1

问题

您可以在上面看到一个示例,以更好地理解问题。所以问题是:协议(protocol)可以用实现者(实现协议(protocol)的类)定义的功能来扩展吗?在我看来,示例代码的结果是出乎意料的。可以没有协议(protocol)继承的方式来完成吗?


更新

我无法在协议(protocol)A(它是UIKit 协议(protocol))中实现someFunc()。这就是为什么我正在考虑正是这种架构/配置。

最佳答案

protocol A: class {
func someFunc()
}

extension A {
func someFunc() {
print("1")
}
}

class AA: A { }

现在在 AA 类中,您可以使用默认实现(在扩展中),或使用自定义实现覆盖它。因此,您必须在协议(protocol)本身中定义一个函数,因为它是接口(interface)。

但是不在协议(protocol)中定义它是没有意义的,那只是一个糟糕的设计,因为协议(protocol)=类上的接口(interface)。如果您想使用一个函数 someFunc() - 您可以立即执行而无需重新声明它,因为自从您实现协议(protocol)后它就已经存在了。

考虑在不暴露协议(protocol)本身功能的情况下扩展协议(protocol),就像扩展您将在其中实现该协议(protocol)的类一样。

更新:

protocol MyProtocol: class {
func myFunc()
}
extension MyProtocol where Self: UIKitProtocol {
func myFunc() {
}
}

class AA: UIKitProtocol, MyProtocol { }

定义你自己的协议(protocol)

关于swift - 可以使用 Swift 中的实现者定义的功能扩展协议(protocol)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63631391/

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