问题描述
我有以下结构:
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
,编译器就可以为您合成符合性。您不需要实现任何方法。