Как использовать необязательную привязку в Swift 2

Я новичок в изучении Swift, поэтому решил, что вместо этого я могу изучить Swift 2. Пока что все имеет смысл, за исключением следующего фрагмента кода. Надеюсь, кто-то может пролить свет на это для меня.

//: Playground - noun: a place where people can play
import UIKit

//Works
let possibleNumber="2"
if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
}
else {
    print("could not be converted to integer")
}

//Doesn't Work and I'm not sure why
let testTextField = UITextField()
testTextField.text = "2"
let numberString = testTextField.text  //I know this is redundant

if let num = Int(numberString) {
    print("The number is: \(num)")
}
else {
    print("Could not be converted to integer")
}

Верхняя часть кода взята из книги Apple Swift 2, и для меня имеет смысл, как она использует необязательную привязку для преобразования строки в int. Второй фрагмент кода в основном такой же, за исключением того, что строка происходит из свойства text объекта UITextField. Нижняя часть кода выдает следующую ошибку:

Не удалось выполнить игровую площадку: /var/folders/nl/5dr8btl543j51jkqypj4252mpcnq11/T/./lldb/843/playground21.swift:18:18: error: значение необязательного типа 'String?' не развернутый; ты хотел использовать '!' или же '?'? if let num = Int (numberString) {

Я исправил проблему с помощью этой строки:

if let num = Int(numberString!) {

Я просто хочу знать, зачем второй пример! а первый нет. Я уверен, что проблема связана с тем фактом, что я получаю строку из текстового поля. Спасибо!

1 ответ

Решение

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

Во втором случае textField.text возвращает необязательную строку и так numberString является необязательной переменной Это может быть ноль.

Сейчас... Конверсия Int("") возвращает необязательный int. если строка "abc", то она не может вернуть число, поэтому возвращает nil. Это то, что вы разворачиваете с if let... заявление.

Однако во втором случае ваша строка также необязательна, и Int() не примет необязательную. Таким образом, вы силой распаковываете это. Это опасно, так как это может привести к сбою приложения, если строка равна нулю.

Что вы могли бы сделать вместо этого это...

if let numberString = textFeidl.text,
    number = Int(numberString) {
    // use the number
}

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

В Swift 2 вы можете использовать guard let Функция здесь также.

Просто видел, что вы используете Swift 2.

Вы можете сделать это так же...

func getNumber() -> Int {
    guard let numberString = textField.text,
          number = Int(numberString)
          else {
          return 0
    }

    return number
}
Другие вопросы по тегам