我需要比较一个类似的泛型参数,如下所示:
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
}
}
并向f()
添加didSet
次来电。
只是为了看看我是否可以从f()
扩展程序获取Equatable
函数来调用(没有成功)。
答案 0 :(得分:0)
如果没有能够看到你的课程等,我就能够产生你想要的东西。您需要确保正确使用等同方法。
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的子类(对于那些首先需要子类化的那些),您只需要进行额外的子类化步骤。
<强>解释强>:
你想要一个if子类为通用Equatable类型的类,可以执行方法f()
。这就是说,您将Item委托为顶级类型,以便有条件地检查Equatable。这意味着由于Item可以或不可以是Equatable,因此您只能将协议应用于Item的子类。如果您将Equatable直接应用于Item,则不会出现问题。为了证明这一点,我将Item
子类化为Item2
,并将Equatable
添加到Item2
。从而为Item创建Equatable
形式的可能性。
现在你引入MyClass<Item>
,这是一个完全独立的实体,但是它可以采用一种继承自或完全是Item的类。但是,既然您指定只需Item
Equatable
的子类(即:class Item2
),则需要为{{1}的类型扩展MyClass
条件这些也是Item
。因此Equatable
。
最后,为了演示整个子类逻辑,你需要继承extension
.. AGAIN ..但这一次,通过指定这个子类将Item2作为泛型类型,以便明确地声明这个子类是等价的,因为在你的情况下,唯一可以等同的子通用Item类型是MyClass<Item>
。
只是通过重新阅读自己,它可能会令人困惑..但你需要记住的是,通过应用泛型,并通过CONDITIONAL EXTENSION使它们符合协议,你允许几个不同类型的相同泛型类存在。因此,在特定的用例中,它增加了采用某些方法所需的子类的数量。
另外。至于你的Item2
变量。我正在调查它...我在这个post中找到了一种方法,可以在Swift 4中使用items : [[Item]]? didSet{}
。我正在更新到Swift 4,因为我们正在测试我的码。