2015-07-04 21 views
5

Jestem nowy w nauce Swift, więc postanowiłem równie dobrze nauczyć się Swift 2. Dla mnie wszystko ma sens, z wyjątkiem poniższego fragmentu kodu. Mam nadzieję, że ktoś może mi o tym powiedzieć.Jak używać opcjonalnego wiązania w 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") 
} 

Górna część kodu jest prosto od Apple Swift 2 ebook i ma to sens dla mnie jak wykorzystuje opcjonalne wiązanie przekonwertować ciąg do int. Drugi fragment kodu jest w zasadzie taki sam, z wyjątkiem tego, że ciąg pochodzi z właściwości tekstowej UITextField. Dolna część kodu daje następujący błąd:

wykonanie zabaw failed: /var/folders/nl/5dr8btl543j51jkqypj4252mpcnq11/T/./lldb/843/playground21.swift:18:18: Błąd: wartość opcjonalna wpisz "String?" nieopakowany; czy chciałeś użyć "!" lub "?"? jeśli niech num = Int (numberString) {

Naprawiłem problem przy użyciu tej linii:

if let num = Int(numberString!) { 

Chcę tylko wiedzieć, dlaczego drugi przykład potrzebuje! a pierwszy nie. Jestem pewien, że problem polega na tym, że otrzymuję ciąg znaków z pola tekstowego. Dzięki!

+0

Pamiętaj, aby zaakceptować odpowiedź, jeśli rozwiązuje problemu :-) – Fogmeister

+0

Dzięki! Używałem tej strony wcześniej, ale nigdy nie napisałem pytania. Twoja odpowiedź była bardzo pomocna. – jobber80

+0

witam w StackOverflow :-) cieszę się, że mogłem pomóc. – Fogmeister

Odpowiedz

7

Różnica polega na tym, że w pierwszym przypadku possibleNumber nie jest zmienną opcjonalną. To zdecydowanie ciąg. To nie może być zero.

W drugim przypadku textField.text zwraca opcjonalny ciąg, a więc numberString jest opcjonalną zmienną. To może być zero.

Teraz ... Konwersja Int("") zwraca opcjonalną wartość int. jeśli ciąg jest "abc", to nie może zwrócić liczby, więc zwraca zero. To właśnie rozpakowujecie z instrukcją if let....

Jednak w drugim przypadku ciąg znaków jest również opcjonalny, a funkcja Int() nie akceptuje opcji opcjonalnej. Więc rozpakowujesz go. Jest to niebezpieczne, ponieważ może spowodować awarię aplikacji, jeśli ciąg znaków jest zerowy.

Co można zrobić zamiast tego jest ...

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

Będzie to rozpakować pierwszy tekst i jeśli jest ona dostępna następnie używać go. Zdobądź numer. Jeśli to nie jest zero, wchodzisz do bloku.

W Swift 2 można również użyć funkcji guard let.

Wystarczy zauważyć, że używasz Swift 2.

Można zrobić to w ten sposób również ...

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

    return number 
}