2014-12-01 1 views
3

Я это мой код, и он работаетКак проверить, равны ли 3 строки в Swift?

if (v1 == v2) && (v2 == v3) { 
    println("3 strings are equal") 
} 

Есть ли другие более Swift способ сделать это?

Моя реализация выглядеть код C :-)

+0

Нет, в C это будет выглядеть как 'если (STRCMP (v1, v2) = = 0 ... ':) –

+0

Я имел в виду из-за && – WebOrCode

+0

' && 'является действительным оператором Swift и имеет преимущество« короткого замыкания ». –

ответ

4

Я так не думаю. Это так же просто, как и получается. (И улучшение на С и ObjC тоже - вы можете использовать оператор == вместо вызова strcmp или isEqual:.)

Если вы действительно хотите, чтобы сходить с ума с ним, вы могли бы написать v1 == v2 == v3 если вы создали пара пользовательских == перегрузки оператора. (Это остается как упражнение для читателя.) Но это, вероятно, не стоит.

1

Вы можете использовать расширение для класса строки, как это:

extension String { 
    func allEquals (s1: String, s2: String) { 
     (this == s1) && (s1 == s2) 
    } 
} 

Я не был скомпилирован, но он должен работать;)

1

Если вы хотите быть действительно Swifty, вы можете проверить массив строк, чтобы быть все равно, как это (можно обернуть, что в продолжение, конечно):

var array = ["test", "test", "test"] 
var allEqual = array.reduce(true, combine: { (accum: Bool, s: String) -> Bool in 
    accum && s == array[0] 
}) 

я бы, вероятно, не позвонить это либо чрезвычайно элегантно, либо суперэффективно ... но это, безусловно, работает.

2

Вы могли бы сделать что-то крутое, как это:

extension Array { 

    func allEqual(isEqual: (T, T) -> Bool) -> Bool { 
     if self.count < 2 { 
      return true 
     } 
     for x in self { 
      if !isEqual(x, self.first!) { 
       return false 
      } 
     } 
     return true 
    } 
} 

И затем вызвать его так:

["X", "Y", "Z"].allEqual(==) // false 
["X", "X", "X"].allEqual(==) // true 
let one = "1" 
var ONE = "1" 
var One = "1" 
[one, ONE, One].allEqual(==) // true 
Смежные вопросы