当通用参数具有可比性时,我需要对其进行比较,如下所示:
class MyClass<Item> {
var items: [[Items]]? {
didSet {
if Item is Equatable {
print(oldValue == items)
} else {
print(false)
}
}
}
}
我怎样才能实现这个目标?
我也尝试过:
extension TableViewModel where Item: Equatable {
func f() -> Bool {
return true
}
}
extension TableViewModel {
func f() -> Bool {
return false
}
}
并向我的 didSet
添加一个 f()
调用。
只是为了看看我是否可以从 Equatable
扩展中获取 f()
函数来调用(没有成功)。
最佳答案
在无法看到您的类(class)等的情况下,我能够制作出您想要的东西。然而,您需要确保正确使用可等同方法。
class Item {
}
class Items {
}
class Item2 : Item, Equatable {
static func ==(_ lhs: Item2,_ rhs: Item2) -> Bool{
return true
}
static func !=(_ lhs: Item2,_ rhs: Item2) -> Bool{
return true
}
}
class MyClass<Item> {
var items: [[Items]]? {
didSet {
}
}
}
extension MyClass where Item : Equatable {
func f() {
print("Hello")
}
}
class TheClass : MyClass<Item2> {
func someFunc() {
super.f()
}
}
let it = TheClass()
it.f() //prints : "Hello"
您只需执行额外的子类化步骤,将 Equatable 应用于 Item 的子类(对于您首先想要子类化的子类)。
说明:
您想要一个类,如果将其子类化为通用 Equatable 类型,则可以执行方法 f()
。话虽如此,您将 Item 委托(delegate)为顶级类型,用于有条件地检查 Equatable。这意味着由于 Item 可以是 Equatable,也可以不是 Equatable,因此您只能将协议(protocol)应用于 Item 的子类。如果您直接将 Equatable 应用于 Item,则不会出现问题。因此,为了证明这一点,我对 Item
进行了子类化进入Item2
,并添加 Equatable
至Item2
。从而创造了项目存在于Equatable
中的可能性。表格。
现在你输入 MyClass<Item>
,它完全是一个单独的实体,但它可以采用继承自 Item 或完全是 Item 的类类型。但是,由于您指定只需要 Item
的子类分别是Equatable
(即: class Item2
),您需要扩展 MyClass
有条件地用于 Item
的类型分别是Equatable
以及。因此extension
。
最后,为了演示整个子类化逻辑,您需要子类化 MyClass<Item>
.. 再次.. 但这一次,通过指定该子类将 Item2 作为泛型类型,以便明确声明该子类是可等同的,因为唯一可等同的子通用 Item 类型是 Item2
在你的情况下。
仅通过重新阅读我自己,它可能会令人困惑。但是您需要记住的是,通过应用泛型,并通过条件扩展使它们符合协议(protocol),您允许同一泛型类的多种不同类型存在。因此,它增加了在特定用例中采用某些方法所需的子类数量。
还有。至于你的items : [[Item]]? didSet{}
多变的。我正在调查它..但是我在这个 post 中找到了一种让它与 Equatable
一起工作的方法在 Swift 4 中。当我们谈论测试我的代码时,我正在更新到 Swift 4。
关于Swift - 当可相等时比较泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45426176/