Как проверить, что текстовое поле не пустое, перед передачей его в функцию:

#swift #optional #conditional-operator

#swift #тип параметра #условный оператор

Вопрос:

У меня есть текстовое поле, которое принимает числа.
При нажатии за пределы области цифровой клавиатуры, чтобы отключить клавиатуру, значение текстового поля передается функции.

Когда текстовое поле пустое, я получаю необязательную ошибку NIL unpacked, и она завершается сбоем.

Я пытаюсь найти способ передать «0» переменной, когда в текстовом поле ничего нет.

Переменная

 @IBOUTLET weak var per1kCollector: UITextField?
var per1k = 0
  

Обработчик для закрытия клавиатуры и вызова функции
per1k захватывает текстовое поле
для per1k требуется 0, если collector.text равен НУЛЮ

 @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
    print("closing number pad")
    
            view.endEditing(true)
            per1k = (Int(per1kCollector!.text!)! ?? 0)

            doSomeMath()
    
}
  

При этом продолжает указываться «не удается преобразовать значение типа ‘int’ в ожидаемый тип аргумента ‘string’. Но я беру значение Int текстового поля, а per1k имеет тип int . ????

Комментарии:

1. Каждый раз, когда в вашем коде указано, что ! вам следует ожидать сбоя. Постарайтесь избежать этого. В этом очень мало необходимости.

2. Также не вводите свой «код» в вопрос. Скопируйте и вставьте реальный код. Такая ерунда, как @IBOUTLET , не нужна.

3. не уверен, что я вас понимаю. Везде еще, когда я вижу снимки экрана, людям рекомендуется вырезать и вставить, что я и сделал.

4. Нет, вы этого не делали, потому что не существует такой вещи, как @IBOUTLET . Ваш код никогда бы не скомпилировался, если бы вы так сказали. Вы получите сообщение об ошибке «Неизвестный атрибут ‘IBOUTLET'».

Ответ №1:

Каждый раз, когда в вашем коде указано, что ! вам следует ожидать сбоя. Постарайтесь избежать этого. В этом очень мало необходимости. В этом случае просто используйте знак вопроса:

  per1k = Int(per1kCollector?.text ?? "0") ?? 0
  

Комментарии:

1. каждый раз, когда я этого не делаю, я продолжаю получать чертовы варианты, чтобы исправить это таким образом … поверьте мне, я пытаюсь

2. Мэтт, спасибо за помощь здесь. Я все еще получаю сообщение об ошибке, что я не могу преобразовать Int в ожидаемую строку аргумента. Я не уверен, на какую строку оно ссылается. значение текстового поля обрабатывается с помощью функции Int(), а переменная в нем была инициализирована как Int.

3. ОК, исправлено, извините за это.