Как использовать необязательную привязку в 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: ошибка: значение необязательного типа 'String?' не развернутый; вы хотели использовать '!' или '?'? если let num = Int (numberString) {

Я исправил проблему, используя эту строку:

if let num = Int(numberString!) {

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


person jobber80    schedule 04.07.2015    source источник
comment
Не забудьте принять ответ, если он решит вашу проблему :-)   -  person Fogmeister    schedule 04.07.2015
comment
Спасибо! Я пользовался этим сайтом раньше, но никогда не задавал вопросов. Ваш ответ был очень полезным.   -  person jobber80    schedule 04.07.2015
comment
добро пожаловать в StackOverflow :-) рад, что смог помочь.   -  person Fogmeister    schedule 04.07.2015


Ответы (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
}
person Fogmeister    schedule 04.07.2015