【问题标题】:Swift's equatable protocol conformance checkSwift 的等价协议一致性检查
【发布时间】:2014-08-02 04:56:03
【问题描述】:

我正在尝试使用以下函数扩展 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,如果有某种方法可以直接断言会很好,但我还没有在任何地方读过。在这些方面,Swift 似乎不如 Obj-C 动态。

更新: 尝试了这个建议,但它不起作用(不知道 <T: Equatable> 的确切用途,但它确实可以编译)。

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

【问题讨论】:

  • 这看起来很奇怪。您是在编写通用代码并且没有发布所有代码,还是 T 是在某处定义的类型?
  • T 是一个类型别名,在Array 结构中定义。查看 Swift 声明文件。

标签: ios swift


【解决方案1】:

我从 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】:

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

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

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

    【讨论】:

      【解决方案3】:

      在方法的签名中指定 T 必须是等价的:

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

      【讨论】:

      • 看起来不错,但不起作用。请查看我的更新。
      • @KhanhNguyen 那是因为您确保参数是可相等的,但数组中的元素可能不是。不过,这个答案应该可以解决您的整体问题:stackoverflow.com/a/24091318/754604
      【解决方案4】:

      怎么样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-31
        • 2021-10-13
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多