微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使具有通用属性的结构符合 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,编译器就可以为您合成符合性。您不需要实现任何方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。