0

理想情况下,我会让服务器实现 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

4

1 回答 1

0

如果你使函数通用,你的问题就会消失:

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(听起来很奇怪)。这意味着声明接收协议的函数不能通过将协议传递给它来调用,您需要告诉编译器您传递的协议的具体实现。

于 2018-08-16T21:03:05.227 回答