gpt4 book ai didi

ios - 如何根据实现该协议(protocol)的两个实例的身份为协议(protocol)实现 Equatable 协议(protocol)?

转载 作者:搜寻专家 更新时间:2023-10-30 23:04:31 26 4
gpt4 key购买 nike

我正在尝试为基于左操作数和右操作数标识的协议(protocol)实现 Equatable 协议(protocol)。换句话说:我如何为一个协议(protocol)实现 Equatable 协议(protocol)以确定实现该协议(protocol)的两个实例(在我的例子中是 iNetworkSubscriber)是否相同(相同的对象引用)。就像那样(错误消息包含在下面的代码中):

protocol iNetworkSubscriber : Equatable {

func onMessage(_ packet: NetworkPacket)

}

func ==(lhs: iNetworkSubscriber, rhs: iNetworkSubscriber) -> Bool { // <- Protocol 'iNetworkSubscriber' can only be used as a generic constraint because it has Self or associated type requirements
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) // <- Cannot invoke initializer for type 'ObjectIdentifier' with an argument list of type '(iNetworkSubscriber)'
}

...我还尝试使用身份运算符本身:

func ==(lhs: iNetworkSubscriber, rhs: iNetworkSubscriber) -> Bool {     // <- Protocol 'iNetworkSubscriber' can only be used as a generic constraint because it has Self or associated type requirements
return lhs === rhs // <- Binary operator '===' cannot be applied to two 'iNetworkSubscriber' operands
}

有人知道如何解决这个问题吗?

最佳答案

这里有两个问题。首先是您不能对值类型使用 ObjectIdentifier。所以你必须声明这个协议(protocol)需要引用(类)类型:

protocol NetworkSubscriber : class, Equatable {
func onMessage(_ packet: NetworkPacket)
}

(请不要在协议(protocol)的开头添加小写的 i。这在 Swift 中以多种方式造成混淆。)

然后,您不能将此协议(protocol)用作类型。它描述了一种类型(因为它通过 Equatable 依赖于 Self)。所以接受它的函数必须是通用的。

func ==<T: NetworkSubscriber>(lhs: T, rhs: T) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}

鉴于 NetworkSubscriber 必须是一个类,您应该非常仔细地询问是否应该在这里使用继承而不是协议(protocol)。具有关联类型的协议(protocol)使用起来非常复杂,混合类和协议(protocol)会产生更多的复杂性。如果您已经在使用类,则类继承会简单得多。

关于ios - 如何根据实现该协议(protocol)的两个实例的身份为协议(protocol)实现 Equatable 协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48324443/

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