Swift - 在等同时比较泛型

时间:2017-07-31 22:21:46

标签: swift generics

我需要比较一个类似的泛型参数,如下所示:

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函数来调用(没有成功)。

1 个答案:

答案 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,因为我们正在测试我的码。