如何比较两个实际符合“Equatable”的“Any”对象
Posted
技术标签:
【中文标题】如何比较两个实际符合“Equatable”的“Any”对象【英文标题】:How to compare two `Any` objects those actually conform to `Equatable` 【发布时间】: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
闭包中得到的obj1a
、obj1b
、obj2
变量都是Any
类型的,这并不'不一定符合Equatable
。因此代码obj1a == obj1b
不会编译。
实际上,如果我检查obj1a is Equatable
,它会返回 true。但我不知道如何将其转换为编译器可以接受的正确类型。 obj1a as! Equatable
无法编译,因为 Equatable
是通用协议。
我不能只写 obj1a as! Foo
,因为如果有另一个类 Bar: Equatable
我希望我的 sharedExample 也适用于此。
这里的主要问题是:我有两个变量转换为Any
,保证它们最初属于符合Equatable
的相同类型。 在不知道它们的实际类型的情况下,我应该如何合法地比较这两个变量?
【问题讨论】:
这个怎么样? ***.com/questions/24299635/… 不应该工作,因为 Equatable 有 Self 与之关联 【参考方案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
【讨论】:
以上是关于如何比较两个实际符合“Equatable”的“Any”对象的主要内容,如果未能解决你的问题,请参考以下文章
如何根据实现该协议的两个实例的身份为一个协议实现 Equatable 协议?