2015-03-07 2 views
1

Я написал простое приложение с использованием Swift и Xcode 6.1.1. Программа, которая является простым калькулятором, работает хорошо, но я не смог проверить не-нильский ввод для трех текстовых полей. В результате, если пользователь оставляет поле пустым, а затем «вычисляет», приложение сбой.Как проверить IBOutlet/var для nil?

Приложение принимает три входа, первоначально как строки. Я написал оператор if, чтобы проверить нуль, но он не работает - он просто переходит к другому независимо. Вот блок кода, который релевантен мой вопрос:

... 
@IBOutlet var calcButton: UIBarButtonItem! 
@IBOutlet var yearOneField: UITextField! 
@IBOutlet var yearTwoField: UITextField! 
@IBOutlet var yearThreeField: UITextField! 
@IBOutlet var displayWindow: UILabel! 

@IBAction func calcButtonTapped(sender: AnyObject) { 

    if (yearOneField == nil) { 

     displayWindow.text = ("Non-zero entries are not permitted. Please enter new values.") 

    } else { 

    let yearOne = yearOneField.text.toInt() 
    let yearTwo = yearTwoField.text.toInt() 
    let yearThree = yearThreeField.text.toInt() 
    ... 

Я думал, что я мог бы оценить IBOutlet за ноль, но это не сработало. Я новичок в Swift и Xcode, поэтому я надеюсь, что это вопрос n00b для более опытных разработчиков. Спасибо.

ответ

1

Текстовые поля сами по себе никогда не будут nil. Они создаются и назначаются во время инициализации, и вы никогда не удаляете их.

Я думаю, что вы хотите, чтобы проверить их text свойства содержат какой-либо текст, который вы можете сделать так:

Обновление для Swift 2:

if let text = yearOneField.text where !text.isEmpty { 
    // perform the conversions 
} else { 
    // the text field is empty 
} 

Вы можете избежать вложенности с помощью guard:

guard let text = yearOneField.text where !text.isEmpty else { 
    // the text field is empty 
    return 
} 

// perform the conversions 

Я предпочитаю синтаксис guard, потому что это Клео rer примерно какой идеальный результат есть.

+0

Спасибо Аарона, это было именно то, что мне нужно делать. – maru37

2

Единственный способ @IBOutlet s может быть nil, если вы забыли связать их в Интерфейс Builder. Обычно вам не нужно проверять это, потому что авария скажет вам исправить эту проблему.

Функция toInt() возвращает необязательный Int (aka Int?), который должен быть развернут перед использованием. toInt() вернет nil, если значение в текстовом поле не является действительным Int. «2.1», «семь» и «» все возвратят nil, если они конвертированы с toInt(). Я рекомендую вам использовать дополнительный обязательный (if let) синтаксис для проверки преобразования для nil и разворачивать результат, если он не nil:

if let yearOne = yearOneField.text.toInt() { 
    if let yearTwo = yearTwoField.text.toInt() { 
     if let yearThree = yearThreeField.text.toInt() { 
      // yearOne, yearTwo, and yearThree are all valid Ints 
      // so do the calculations 
     } 
    } 
} 

С другой стороны, если вы знаете, что вы хотите использовать значение по умолчанию (например, 0), когда поле не может быть превращено в Int, вы можете разворачивать результат, используя всухую коалесцирующего оператор?? так:

let yearOne = yearOneField.text.toInt() ?? 0 
let yearTwo = yearTwoField.text.toInt() ?? 0 
let yearThree = yearThreeField.text.toInt() ?? 0 
+0

Спасибо @vacawama. Я собираюсь попробовать это, чтобы попытаться сделать мой код немного умнее. – maru37

+0

Что делать, если функция async возвращается после того, как вы перешли от просмотра? Если вы сделаете ссылку на IBOutlet в обработчике завершения, будет ли это nil? – FateNuller

+1

@FateNuller, либо ваше закрытие захвачено 'self', и в этом случае viewController будет зависать, пока ваше закрытие не будет завершено, и выдает сильный указатель на' self', или если вы используете '[слабый self]', чтобы иметь слабый указатель на viewController, тогда, когда viewController будет освобожден, ваш 'self' будет установлен на' nil', и у вас не будет доступа к '@ IBOutlets', потому что они уже давно исчезнут. В любом случае вам не нужно беспокоиться о том, что выходы «nil». – vacawama

Смежные вопросы