2016-01-13 14 views
9

Ich habe mehrere "Any" -Werttypen, die ich vergleichen möchte.So vergleichen Sie "Any" -Werttypen

var any1: Any = 1 
var any2: Any = 1 

var any3: Any = "test" 
var any4: Any = "test" 

print(any1 == any2) 
print(any2 == any3) 
print(any3 == any4) 

den Operator == Verwendung zeigt einen Fehler:

"Binary operator '==' cannot be applied to two 'Any' (aka 'protocol<>') operands"

Was die Art und Weise, dies zu tun wäre?

+5

Wie können Sie Dinge vergleichen, von denen Sie nichts wissen? Warum machst du sie "Any"? – Wain

+1

Ich prüfe nur schnelle Fähigkeiten. –

+1

@theReverend '===' vergleicht Referenzen, so kann es nur auf Referenztypen angewendet werden - die alle mit AnyObject übereinstimmen –

Antwort

13

Der einzige Weg, dies ist mit einer anderen Funktion als == zu tun, die einen Typparameter nimmt und vergleicht dann die Werte, wenn sie beide dieser Art sind:

func isEqual<T: Equatable>(type: T.Type, a: Any, b: Any) -> Bool? { 
    guard let a = a as? T, let b = b as? T else { return nil } 

    return a == b 
} 

nun oben mit Ihrer Variablen, Sie können sie so vergleichen:

var any1: Any = 1 
var any2: Any = 1 

var any3: Any = "test" 
var any4: Any = "test" 

isEqual(Int.self, a: any1, b: any2)  // true 
isEqual(Int.self, a: any2, b: any3)  // nil 
isEqual(String.self, a: any3, b: any4) // true 
3

Um den Operator == zu verwenden, muss der Typ Equatable Protokoll entsprechen. Any Protokoll entspricht nicht Equatable Protokoll, so gibt es keine Möglichkeit, zwei Any Werte zu vergleichen. Es ist logisch - Any ist zu weit gefasst - Werte können keinen "gemeinsamen Nenner" haben.

Darüber hinaus erlaubt Swift nicht, zwei Equatable Werte zu vergleichen, die unterschiedlichen Typ haben. Z.B. Sowohl Int als auch String entsprechen Equatable aber 1 == "1" kompiliert nicht. Der Grund dafür ist die Deklaration von == in Equatable Protokoll: func ==(lhs: Self, rhs: Self) -> Bool. Dieses Selbst bedeutet grundsätzlich, dass beide Argumente den gleichen Typ haben müssen. Es ist eine Art Platzhalter - in der Implementierung für einen bestimmten Typ sollte Self durch den Namen dieses Typs ersetzt werden.

Verwandte Themen