2015-07-04 10 views
5

Sono nuovo nell'apprendimento di Swift quindi ho deciso che avrei potuto imparare anche Swift 2. Tutto ha avuto senso per me finora tranne per il seguente frammento di codice. Spero che qualcuno possa far luce su questo per me.Come utilizzare l'associazione opzionale in 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") 
} 

La sezione superiore del codice è retta dalla Swift 2 ebook di Apple e ha senso per me come usa opzionale vincolante per convertire la stringa in un int. Il secondo pezzo di codice è fondamentalmente lo stesso ad eccezione del fatto che la stringa proviene dalla proprietà text di un UITextField. La parte inferiore del codice dà il seguente errore:

esecuzione Playground riuscita: /var/folders/nl/5dr8btl543j51jkqypj4252mpcnq11/T/./lldb/843/playground21.swift:18:18: errore: il valore di optional digitare 'String?' non scartato; intendevi usare '!' o '?'? se lasciate num = Int (numberString) {

ho risolto il problema utilizzando questa linea:

if let num = Int(numberString!) { 

Voglio solo sapere perché il secondo esempio ha bisogno del! e il primo no. Sono sicuro che il problema ha a che fare con il fatto che sto ottenendo la stringa da un campo di testo. Grazie!

+0

Ricordarsi di accettare una risposta se si risolve il problema :-) – Fogmeister

+0

Grazie! Ho usato questo sito prima ma non ho mai postato una domanda. La tua risposta è stata molto utile. – jobber80

+0

benvenuto su StackOverflow :-) felice di essere stato in grado di aiutarti. – Fogmeister

risposta

7

La differenza è che nel primo caso possibleNumber non è una variabile opzionale. È decisamente una stringa. Non può essere nulla.

Nel secondo caso textField.text restituisce una stringa opzionale e quindi numberString è una variabile facoltativa. Potrebbe essere nullo.

Ora ... La conversione Int("") restituisce un int opzionale. se la stringa è "abc", allora non può restituire un numero, quindi restituisce zero. Questo è ciò che stai scartando con la dichiarazione if let....

Tuttavia, nel secondo caso la stringa è anche facoltativa e l'Int() non accetta un optional. Quindi sei costretto a scartarlo. Questo è pericoloso in quanto potrebbe causare il crash dell'applicazione se la stringa è nulla.

Che cosa si potrebbe fare, invece è questo ...

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

Ciò scartare il testo prima e se è disponibile quindi utilizzarlo per. Ottieni il numero. Se questo non è nulla, allora si entra nel blocco.

In Swift 2 è possibile utilizzare anche la funzione guard let.

appena visto che si sta utilizzando Swift 2.

Si può fare in questo modo anche ...

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

    return number 
}