swift - 在两个协议(protocol)对象上使用 equals

标签 swift operator-overloading protocols equatable

理想情况下,我会让服务器实现 Equatable 协议(protocol),但我遇到了问题。这是我的代码

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

最终我只想比较抽象协议(protocol)对象。大多数其他示例都在比较具体类型。

我尝试这个或者什么是疯狂的吗? :P

最佳答案

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

func doSomething<T1: Server, T2: Server>(server0: T1, server1: T2) {

这是必需的,因为在 Swift 中 protocols don't conform to base protocols, not even to themselves 。添加通用子句根据调用时传递的参数将函数从抽象更改为具体。

以下代码会发生同样的错误:

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

关于swift - 在两个协议(protocol)对象上使用 equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885208/

相关文章:

Swift:Extension中的这句话是什么意思?

java - Diameter协议(protocol)库.net C#或java

ios - 为什么我的一些锚定约束不起作用,而其他锚定约束却对同一项目起作用?

ios - 从解析到 UIImage 数组中查询照片 - Swift 2.0

C++:字符串运算符重载

c# - 在 C# 中重载 [][]

swift - 在协议(protocol)定义中包含函数与仅在扩展中定义函数的原因是什么?

ios - (使用 Swift 进行 UI 测试)获取事件应用程序列表失败 : AX error -25205

ios - 更改tableView中的值

c++ - 迭代 vector 并将迭代器实际指向的对象添加为 map 中的键