给定一个Swift对象的实例,我们可以测试它的类是否存在类函数?

时间:2018-02-07 16:38:43

标签: swift class generics static protocols

我环顾四周,并没有看到我的问题的答案(但也许我应该可以推断一个)。

我有一个基于协议的对象。它是一个关联的类型协议,根据分配给关联类型的类型定义类操作符,如下所示:

protocol GenericBaseProtocol {
    associatedtype T

    var myProperty: T {get set}
    init(_ myProperty: T )
}

extension GenericBaseProtocol where T: Equatable {
    static func ==(lhs: Self, rhs: Self) -> Bool {
        return lhs.myProperty == rhs.myProperty
    }
}

因此,如果我创建一个基于此的类,并给T一个Equatable类型,就像这样:

class IntClass: GenericBaseProtocol {
    typealias T = Int
    var myProperty: T = 0

    required init(_ myProperty: T ) {
        self.myProperty = myProperty
    }
}

结果对象应具有可比性,如下所示:

let lhs = IntClass(3)
let rhs = IntClass(4)

let isEqual = lhs == rhs

冷却。现在,如果我然后创建一个非Equatable类型的实例,如下所示:

class ArrayClass: GenericBaseProtocol {
    typealias T = [String]
    var myProperty: T = []

    required init(_ myProperty: T ) {
        self.myProperty = myProperty
    }
}

并实例化,如下:

let lhs2A = ArrayClass(["HI"])
let rhs2A = ArrayClass(["Howaya"])

尝试此操作时,我会遇到编译时语法错误:

let isEqual = lhs2A == rhs2A

我希望能够做的是测试lhs2A的类对象,看看它是否实现了静态函数==(lhs:Self,rhs:Self) - >布尔

我不确定这可以做到,但如果我可以在操场上添加运行时/后卫证明,而不是简单地注释掉代码,那么我写这篇文章会很好。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果关联类型不是Equatable,您可以扩展协议以为==运算符提供默认实现。

这也可用于提供类型与否相等的运行时指示器。

例如:

extension GenericBaseProtocol where T: Equatable {
    static func ==(lhs: Self, rhs: Self) -> Bool {
        return lhs.myProperty == rhs.myProperty
    }
    var isEquatable:Bool { return true }
}

extension GenericBaseProtocol {
    static func ==(lhs: Self, rhs: Self) -> Bool {
        return false
    }
    var isEquatable:Bool { return false }
}