Skip to main content
 首页 » 操作系统

Swift之实现平等

2024年01月01日43zfyouxi

我有以下我想要 Equatable 的类(class)。一切正常,除了操作符似乎完全覆盖了全局 == 操作符。

// User.swift 
class User: Equatable { 
    let id: Int 
 
    init(_ id: Int) { 
        self.id = id 
    } 
} 
 
func == (lhs: User, rhs: User) -> Bool { 
    return (lhs.id == rhs.id) 
} 

当我尝试使用 == 时,它似乎在代码的其他地方提示“T 不可转换为 User”。但这是一个完全不同的类,与用户无关

// ArrayExtension.swift 
extension Array { 
 
    public func contains(object: T) -> Bool { 
        for x in self { 
            // Compile error here "T is not convertible to User" 
            if (x == object) { 
                return true 
            } 
        } 
 
        return false 
    } 
} 

代码有什么问题

请您参考如下方法:

问题是 Array 中的 T 不一定是 Equatable。因此,您不能在扩展中使用 ==。

你得到这个错误的原因是编译器正在尽最大努力找到一个可以使用的函数,叫做 ==。它恰好找到了您的 == 函数,但它给出了一个错误,因为它实际上与类型不匹配。

注意:编译器显然可以通过其错误消息传递一些可用性工作