2015-07-04 2 views
5

Я новичок в изучении Swift, поэтому решил, что я мог бы также изучить Swift 2. Все до сих пор имело для меня смысл, за исключением следующего фрагмента кода. Надеюсь, кто-то может пролить свет на это для меня.Как использовать необязательное связывание в 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 книги и это имеет смысл для меня, как он использует опциональное связывание, чтобы преобразовать строку в междунар. Вторая часть кода в основном такая же, за исключением того, что строка исходит из свойства text UITextField. Нижняя часть кода дает следующее сообщение об ошибке:

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

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

if let num = Int(numberString!) { 

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

+0

Не забудьте принять ответ, если он решит вашу проблему :-) – Fogmeister

+0

Спасибо! Раньше я использовал этот сайт, но никогда не задавал вопрос. Ваш ответ был очень полезным. – jobber80

+0

добро пожаловать в StackOverflow :-) рад, что я смог помочь. – Fogmeister

ответ

7

Разница в том, что в первом случае 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 
} 
Смежные вопросы