在两个协议对象上使用 equals
Using equals on two protocol objects
理想情况下,我会让服务器实现 Equatable 协议,但我 运行 遇到了问题。这是我的代码
protocol Server {
var ipAddress: String { get }
// simplified for this question
}
func ==<T:Server>(lhs: T, rhs: T) -> Bool {
return lhs.ipAddress == rhs.ipAddress
}
func !=<T:Server>(lhs: T, rhs: T) -> Bool {
return lhs.ipAddress != rhs.ipAddress
}
func ==<T:Server, U:Server>(lhs: T, rhs: U) -> Bool {
return lhs.ipAddress == rhs.ipAddress
}
func !=<T:Server, U:Server>(lhs: T, rhs: U) -> Bool {
return lhs.ipAddress != rhs.ipAddress
}
func doSomething(server0: Server, server1: Server) {
// I want to compare to Server objects
// !!! Compile Error !!!
// Binary operator '==' cannot be applied to two 'Server' operands
guard server0 == server1 else {
print("SAME BAD")
return
}
print("DO stuff")
}
最终我只想比较抽象协议对象。大多数其他示例都在比较具体类型。
我是不是为尝试这个而疯狂? :P
如果您将函数设为通用,您的问题就会消失:
func doSomething<T1: Server, T2: Server>(server0: T1, server1: T2) {
这是必需的,因为在 Swift 中。添加通用子句会根据调用时传递的参数将函数从抽象更改为具体。
同样的错误发生在下面的代码中:
struct A: Server {
let ipAddress: String = ""
}
let server1: Server = A()
let server2: Server = A()
print(server1 == server2) // Binary operator '==' cannot be applied to two 'Server' operands
错误的原因相同:Server
不符合 Server
(听起来很奇怪)。这意味着不能通过向其传递协议来调用声明接收协议的函数,您需要告诉编译器您传递的协议的具体实现。
理想情况下,我会让服务器实现 Equatable 协议,但我 运行 遇到了问题。这是我的代码
protocol Server {
var ipAddress: String { get }
// simplified for this question
}
func ==<T:Server>(lhs: T, rhs: T) -> Bool {
return lhs.ipAddress == rhs.ipAddress
}
func !=<T:Server>(lhs: T, rhs: T) -> Bool {
return lhs.ipAddress != rhs.ipAddress
}
func ==<T:Server, U:Server>(lhs: T, rhs: U) -> Bool {
return lhs.ipAddress == rhs.ipAddress
}
func !=<T:Server, U:Server>(lhs: T, rhs: U) -> Bool {
return lhs.ipAddress != rhs.ipAddress
}
func doSomething(server0: Server, server1: Server) {
// I want to compare to Server objects
// !!! Compile Error !!!
// Binary operator '==' cannot be applied to two 'Server' operands
guard server0 == server1 else {
print("SAME BAD")
return
}
print("DO stuff")
}
最终我只想比较抽象协议对象。大多数其他示例都在比较具体类型。
我是不是为尝试这个而疯狂? :P
如果您将函数设为通用,您的问题就会消失:
func doSomething<T1: Server, T2: Server>(server0: T1, server1: T2) {
这是必需的,因为在 Swift
同样的错误发生在下面的代码中:
struct A: Server {
let ipAddress: String = ""
}
let server1: Server = A()
let server2: Server = A()
print(server1 == server2) // Binary operator '==' cannot be applied to two 'Server' operands
错误的原因相同:Server
不符合 Server
(听起来很奇怪)。这意味着不能通过向其传递协议来调用声明接收协议的函数,您需要告诉编译器您传递的协议的具体实现。