Я хочу реализовать ValueObjectSharedExampleConfiguration: QuickConfiguration
, используя Quick
.Как сравнить два объекта `Any`, которые фактически соответствуют` Equatable`
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
Закрытие всех типов Any
, что не обязательно соответствует Equatable
. При этом код obj1a == obj1b
не будет компилироваться.
Фактически, если я проверяю obj1a is Equatable
, он возвращает true. Но я не знаю, как передать его правильному типу, который примет компилятор. obj1a as! Equatable
не будет компилироваться, потому что Equatable
является общим протоколом.
Я не могу просто написать obj1a as! Foo
, потому что если есть другой класс Bar: Equatable
, то я хочу, чтобы мой sharedExample также работал на это.
Основная проблема здесь: у меня есть две переменные, отличные от Any
, которые гарантированно будут изначально того же типа, что соответствует Equatable
. Как я должен юридически сравнивать эти две переменные без знания их фактического типа?
Что об этом? http://stackoverflow.com/questions/24299635/downcast-from-any-to-a-protocol – sdasdadas
Не должно работать, так как Equatable связывается с ним – Andreas