Swift - 当可相等时比较泛型

标签 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
    }

}

并向我的 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 ,并添加 EquatableItem2 。从而创造了项目存在于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/

相关文章:

Java 泛型类,如何为可能的参数类型定义构造函数

java - 编译器为什么以及如何区别对待这两个条件?

c# - 具有可选泛型参数的泛型方法

c# - IEnumerable 到 T[] 数组

objective-c - 是否可以将 NULL NSError** 传递给抛出的 Swift 函数?

ios - 从后台打开应用程序时不调用 ViewDidAppear

ios - 更改导航栏标题字体 - swift

swift - 为什么不可变对象(immutable对象)的属性在 Swift 中是可变的?

ios - 呈现特定的 TabBarItem - iOS

generics - 如何转换 Array<T?>?进入 Kotlin 中的 Array<T>