如何使具有通用属性的结构符合 equatable?

问题描述

我有以下结构:

struct IndexAndItem<ItemType> {
    let index: Int
    let item: ItemType
}

我需要使 IndexAndItem<MyClass> 符合 Equatable

MyClass 已经符合 Equatable 但是当我尝试时:

extension IndexAndItem: Equatable where ItemType == MyClass {
    internal static func == (lhs: IndexAndItem,rhs: IndexAndItem) -> Bool {
        lhs.item == rhs.item
    }
}

我收到一个错误

方法“==”必须声明为公共,因为它符合公共协议“Equatable”中的要求

将其更改为 public 然后会引发另一个错误,要求将 public 替换为 internal

在这里做错了什么?

解决方法

正如上面的 @vadian 建议的那样,您可以这样做 -

struct IndexAndItem<ItemType: Equatable>: Equatable {
    let index: Int
    let itemType: ItemType
}

这样,您就不必担心以后会与 ItemType 一起使用更多 IndexAndItem 类型。


如果您只是想知道如何让它按照您尝试的方式工作,这里是我对这两种 internal 类型的工作方式。

class MyClass: Equatable {
    let flag: Bool
    init(flag: Bool) { self.flag = flag }
    static func == (lhs: MyClass,rhs: MyClass) -> Bool {
        lhs.flag == rhs.flag
    }
}

struct IndexAndItem<ItemType> {
    let index: Int
    let itemType: ItemType
}

// Restricted to one type `MyClass`
extension IndexAndItem: Equatable where ItemType == MyClass {
}

// Open to all types that conform to `Equatable`
extension IndexAndItem: Equatable where ItemType: Equatable {
}

只要您的 ItemType 符合 Equatable,编译器就可以为您合成符合性。您不需要实现任何方法。