Swift的等同协议一致性检查

时间:2014-06-12 00:21:39

标签: ios swift

我正在尝试使用以下函数扩展Swift的Array类:

func containsObjectIdenticalTo(obj: T) -> Bool {
    // objectPassingTest returns the first object passing the test
    return objectPassingTest { x in x == obj }
}

显然,这不会编译,因为编译器还不知道==是否为类型T实现。然后我将代码更改为此

func containsObjectIdenticalTo(obj: T) -> Bool {
    return objectPassingTest {
        x in
        assert(x is Equatable && obj is Equatable)
        return (x as Equatable) == (obj as Equatable)
    } != nil
}

哪个也不起作用,因为无法检查对Equatable的一致性(因为Equatable未定义为@obj

对此有何想法?如果T符合Equatable的某种方式可以直接断言,那会很好,但我无法在任何地方阅读。在这些东西中,斯威夫特似乎没有Obj-C那么动态。

更新 尝试过这个建议而且它没有用(不确切知道<T: Equatable>是什么,而是编译)。

func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {
    var x = self[0]
    var y = self[0]
    return x == y // Error here
}

4 个答案:

答案 0 :(得分:4)

指定T必须在Method&#39签名中是等号:

func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {/*...*/}

答案 1 :(得分:2)

我从ExSwift得到了这个:https://github.com/pNre/ExSwift

 func contains <T: Equatable> (items: T...) -> Bool {
        return items.all { self.indexOf($0) >= 0 }
    }

func indexOf <U: Equatable> (item: U) -> Int? {
        if item is Element {
            if let found = find(reinterpretCast(self) as Array<U>, item) {
                return found
            }

            return nil
        }

        return nil
    }

func all (call: (Element) -> Bool) -> Bool {
        for item in self {
            if !call(item) {
                return false
            }
        }

        return true
    }

也许你可以尝试一下

答案 2 :(得分:1)

怎么样:

func containsObjectIdenticalTo<T : Equatable>(obj: T) -> Bool {
 ... etc ...
}

答案 3 :(得分:1)

最后,我采用了这个解决方案

func containsObjectIdenticalTo<U: Equatable>(obj: U) -> Bool {
    return objectPassingTest({
        x in
        return x as U == obj
    }) != nil
}

可能不是最好的(即最安全的)。但它很有效。