2016-06-18 30 views
6

Qualcuno sa di una scorciatoia per verificare se tre numeri sono uguali? So che questo funziona:Confronta tre valori per l'uguaglianza

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

} 

Ma vorrei qualcosa di più pulito, come;

if number1 == number2 == number3 { 

} 

È abbastanza importante poiché sto confrontando molti valori diversi.

+1

Ho paura che potrebbe essere chiesto un già, anche se non riesco a trovare un dupe. – nicael

+1

Si prega di notare che meno codice non significa necessariamente un'esecuzione più rapida. Infine, se hai bisogno di eseguire molte operazioni e hai bisogno di velocità reale, dovresti prendere in considerazione le istruzioni [simd] (http://www.russbishop.net/swift-2-simd) disponibili in Swift. –

risposta

8

È possibile utilizzare il potere delle tuple e la proprietà transitiva di uguaglianza.

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

} 

La clausola di questo, se è vero solo quando number1 è uguale a number2Enumber2 è uguale a number3. Significa che i 3 valori devono essere uguali.

3

Si possono aggiungere in un array e utilizzare i set:

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

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

Si potrebbe utilizzare un set

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

se Direi che non è trasparente come multiplo se clausole

+0

Il post menziona "Sto confrontando molti valori diversi", quindi questo è l'approccio più sostenibile rispetto all'uso delle tuple. –

3

Non so di nient'altro che un Set, suggerirei di inserirlo in una funzione per rendere chiaro il tuo intento. Qualcosa in questo senso:

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 
} 

Oltre a ciò, forse potresti essere fantasioso con il sovraccarico dell'operatore?

1

Prova questo:

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

Dove NumericType è definito in questo post: What protocol should be adopted by a Type for a generic function to take any number type as an argument in Swift?

questo vi permetterà di utilizzare la funzione per tutti i tipi di numero

Basta passare qualsiasi numero di numeri Mi piace:

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