我想使用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]
,因此我obj1a
,obj1b
,obj2
变量进入sharedExample
} closure都是Any
类型,它不一定符合Equatable
。因此代码obj1a == obj1b
不会编译。
实际上如果我检查obj1a is Equatable
它会返回true。但我不知道如何将其转换为编译器将接受的正确类型。 obj1a as! Equatable
无法编译,因为Equatable
是通用协议。
我不能只写obj1a as! Foo
,因为如果有另一个类Bar: Equatable
,我希望我的sharedExample也适用于此。
这里的主要问题是:我有两个变量转换为Any
,它们保证最初属于符合Equatable
的相同类型。 如果不知道它们的实际类型,我应该如何合法地比较这两个变量?
答案 0 :(得分:0)
你可以使用函数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
}
}