2016-06-18 9 views
6

Kennt jemand eine Abkürzung, um zu testen, ob drei Zahlen gleich sind? Ich weiß, das funktioniert:Vergleichen Sie drei Werte für die Gleichheit

if number1 == number2 && number2 == number3 { 

} 

Aber ich möchte etwas sauberer, wie z.

if number1 == number2 == number3 { 

} 

Es ist ziemlich wichtig, da ich viele verschiedene Werte vergleiche.

+1

Ich fürchte es könnte gefragt werden a Ich bin schon dabei, obwohl ich keinen Betrogenen finden kann. – nicael

+1

Bitte beachten Sie, dass weniger Code nicht unbedingt eine schnellere Ausführung bedeutet. Schließlich, wenn Sie viele Operationen durchführen müssen und Sie echte Geschwindigkeit benötigen, sollten Sie die in Swift verfügbaren [simd] (http://www.russibishop.net/swift-2-simd) Anweisungen beachten. –

Antwort

8

Sie können die Stärke von Tupel und die Transitive Eigenschaft der Gleichheit verwenden.

if (number1, number2) == (number2, number3) { 

} 

Die Klausel dieses IF ist nur wahr, wenn number1 ist gleich zu number2UNDnumber2 ist number3 entspricht. Es bedeutet, dass die 3 Werte gleich sein müssen.

3

Sie können sie in einem Array und Verwendung Sets hinzufügen:

var someSet = NSSet(array: [2,2,2]) 

if someSet.count == 1 { 
    print("Same values") 
} 
7

Sie einen Satz verwenden könnte

if Set([number1, number2, number3]).count == 1 { 
    ... 

obwohl ich behaupten würde es nicht so transparent wie mehrere, wenn Klauseln

+0

Der Beitrag erwähnt "Ich vergleiche viele verschiedene Werte", also ist dies der nachhaltigere Ansatz als Tupel zu verwenden. –

3

Ich weiß nichts anderes als ein Set, ich würde vorschlagen, es in eine Funktion zu verpacken, um Ihre Absicht klar zu machen. Etwas in dieser Richtung:

func allItemsEqual<T>(items:[T]) -> Bool { 
    guard items.count > 1 else { fatalError("Must have at least two objects to check for equality") } 
    return Set(items).count == 1 
} 

func allItemsEqual(items:T...) -> Bool { 
    return equal(items) 
} 

if allItemsEqual(2,3,2) { 
    // false 
} 

if allItemsEqual(2, 2, 2) { 
    // true 
} 

Darüber hinaus, vielleicht könnten Sie mit Betreiber Überlastung Lust bekommen?

1

Try this:

func areEqual<T: NumericType>(numbers: T...) -> Bool { 
    let num = numbers[0] 
    for number in numbers { 
     if number != num { 
      return false 
     } 
    } 
    return true 
} 

Wo NumericType in diesem Beitrag nicht definiert ist: What protocol should be adopted by a Type for a generic function to take any number type as an argument in Swift?

Dies ermöglicht es Ihnen, die Funktion für alle Nummerntypen zu verwenden

Sie passieren nur eine beliebige Anzahl von Zahlen wie:

//returns true 
if areEqual(1, 1, 1) { 
    print("equal") 
}