2014-12-20 3 views
5

У меня есть случай, когда я хочу проверить, есть ли у меня опция, равная строке. Сначала я должен развернуть его, чтобы проверить, существует ли он, тогда я хочу проверить, соответствует ли он другой строке. Однако это дает мне проблему, когда мне приходится дважды писать один и тот же код. Я приведу вам пример:Проверка необязательного isEqualToString

var person : Person = Person() 

    if let name = person.name { 
     if name.isEqualToString("John") { 
      println("Hello, John!") 
     } 
     else { 
      println("Wait a minute, you're not John!") 
    } 
    else { 
     println("Wait a minute, you're not John!") 
    } 

Как вы можете видеть, мне нужно написать инструкцию else дважды. Однажды, если имя существует, и это не «Джон», а другое время, когда имя не существует.

Вопрос в том, как это можно сделать надлежащим образом.

Спасибо за помощь!

ответ

9

Optional имеет оператор ==, определенный для него в стандартной библиотеке Swift:

func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool 

Это означает, что если опция содержит эквивалентное значение, вы можете сравнить два дополнительных параметра. Если оба параметра равны нулю, они равны, и если два опционных блока обертывают значения, равные, то они равны.

Так что, если вы не заботитесь о том person.name является nil или нет, содержит только ли это значение «John», вы можете просто написать if person.name == "John".

Как это работает, когда «Джон» - это String, а не String?? * Поскольку Swift будет неявно преобразовывать любой тип в необязательную обертку, если это то, что требует аргумент. Так как функция == для сравнения опций требует аргумента String?, «Джон» будет неявно преобразован в {Some "John"}, что позволит использовать оператор == между двумя опциями. .

* а на самом деле «Джон» не String либо, это строка символов, которая становится конвертировано в String

+0

PS Есть ли когда-нибудь причина использовать' .isEqualToString' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' должен работать либо с 'NSString', либо' String' (или строковый литерал) с обеих сторон. –

+0

Спасибо за ваш ответ. Это работает, но только если установлено имя person.name. имя не было установлено, я получаю предупреждение «неожиданно найдено нуль при распаковке необязательного значения». У меня есть случаи, когда имя не было установлено, поэтому, чтобы подвести итог, я хочу проверить, является ли это «Джон», а не ноль. – fisher

+0

Даже если 'name' не задано, вы должны использовать' == '.Проверка его равна Джону, должно быть достаточно, чтобы подтвердить, что это не ноль. Например, запустите это на игровой площадке: 'let s: NSString? = nil; s == "John" // возвращает false, no error'. Вы уверены, что нет какой-либо другой части заявления, которое может быть снято с усилием, может ли быть «как» там? –

1
var person : Person = Person() 
let name = person.name 
if (name != nil && name! == "John") 
{ 
    println("Hello, John!") 
} 
else 
{ 
    println("Wait a minute, you're not John!") 
} 
+1

Спасибо за ваш ответ Это по-прежнему бросает мне ошибку: «неожиданно нашли ноль в то время как разворачивание Необязательное значение ". Этот тип кода использовался для работы в объекте C, но в быстрой он действительно не хочет проверять, что-то не ноль. Я что-то упустил? – fisher

0

Поскольку вы тестируете три различных условия, правильное значение, неправильное значение или отсутствие значения, произойдет некоторое дублирование.

Это может быть сведено к минимуму путем извлечения дублирования в новый метод, например:

func notJohn() { 
    println("Wait a minute, you're not John!") 
} 

if let name = person.name { 
    if (name == "John") { 
     println("Hello, John") 
    } else { 
     notJohn() 
    } 
} else { 
    notJohn() 
} 
-2

Я не знаком с Swift, не уверен, если это ваш ответ

let name = person.name 
if name == "John" { 
    println("Hello, John!") 
    } 
else{ 
    println("Wait a minute, you're not John!") 
} 
Смежные вопросы