【问题标题】:How to compare two `Any` objects those actually conform to `Equatable`如何比较两个实际符合“Equatable”的“Any”对象
【发布时间】:2017-02-08 11:56:57
【问题描述】:

我想使用Quick 实现ValueObjectSharedExampleConfiguration: QuickConfiguration

class ValueObjectSharedExampleConf: QuickConfiguration {
    override class func configure(_ configuration: Configuration) {
        sharedExamples("Value Object") {
            (context: @escaping SharedExampleContext) in
            describe("same objects") {
                it("should be equal") {
                    let obj1a = context()["1a"]
                    let obj1b = context()["1b"]
                    expect(obj1a == obj1b).to(beTrue())
                }
            }
            describe("different objects") {
                it("should not be equal") {
                    let obj1 = context()["1a"]
                    let obj2 = context()["2"]
                    expect(obj1 == obj2).to(beFalse())
                }
            }
        }
    }
}

然后我想用这样的共享示例测试任何符合Equatable 的类/结构:

itBehavesLike("Value Object") { [ "obj1a": foo1a, "obj1b": foo1b, "obj2": foo2] }

但问题是,SharedExampleContext 实际上是一个闭包返回[String: Any],所以我在sharedExample 闭包中得到的obj1aobj1bobj2 变量都是Any 类型的,这并不'不一定符合Equatable。因此代码obj1a == obj1b 不会编译。

实际上,如果我检查obj1a is Equatable,它会返回 true。但我不知道如何将其转换为编译器可以接受的正确类型。 obj1a as! Equatable 无法编译,因为 Equatable 是通用协议。

我不能只写 obj1a as! Foo,因为如果有另一个类 Bar: Equatable 我希望我的 sharedExample 也适用于此。

这里的主要问题是:我有两个变量转换为Any,保证它们最初属于符合Equatable 的相同类型。 在不知道它们的实际类型的情况下,我应该如何合法地比较这两个变量?

【问题讨论】:

标签: swift quick-nimble


【解决方案1】:

您可以拥有一个带有函数 isEqualTo(object: Any) 的 MyComparable 协议,并为 Foo 和 Bar 实现它。然后你可以:

let object1 = obj1 as! MyComparable
object1.isEqualTo(obj2)

并且在 isEqualTo 的实现中检查类型或强制转换它,如果你确定它总是相同的:

class Foo: MyComparable {
    func isEqualTo(_ object: Any) -> Bool {
        let obj2 = object as! Foo
        return self == obj2
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2016-09-16
    • 2017-11-29
    相关资源
    最近更新 更多