2017-02-08 4 views
0

Я хочу реализовать 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. Как я должен юридически сравнивать эти две переменные без знания их фактического типа?

+0

Что об этом? http://stackoverflow.com/questions/24299635/downcast-from-any-to-a-protocol – sdasdadas

+0

Не должно работать, так как Equatable связывается с ним – Andreas

ответ

0

У вас может быть протокол MyComparable с функцией isEqualTo (объект: Any) и реализовать его для 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 
    } 
} 
Смежные вопросы