2015-08-01 27 views
6

Capisco come funzionano gli optionals, ma questo mi sta gettando per un ciclo. Ho una variabile chiamata num e voglio incrementarlo, così ho fatto la seguente:Incremento Swift Int! non funziona

var num:Int! = 0 
num++    //ERROR - Unary operator ++ cannot be applied to an operand of type Int! 

Ma per qualche motivo Swift non mi permette di incrementare una forza scartò Int, anche se si suppone di essere trattati come un normale Int con la capacità di nulla dietro le quinte. Così ho provato quanto segue, e ha funzionato:

var num:Int! = 0 
num = num + 1  //NO ERROR 

Tuttavia, sulla base del messaggio di errore che mi ha dato, ho provato quanto segue per rendere l'operatore di incremento ancora molto lavoro:

var num:Int! = 0 
num!++   //NO ERROR 

La mia domanda è perché il primo bit di codice si interrompe, quando il secondo e il terzo bit di codice non lo fanno? Inoltre, dal momento che num è un Int!, non dovrei essere in grado di trattarlo come un normale Int? Infine, poiché un Int! deve essere trattato come un normale Int, come posso scartarlo nel terzo esempio? Grazie.

+1

Poiché si sta inizializzando immediatamente con '0', non deve essere opzionale. Puoi avere 'var num = 0' senza bisogno di inizializzatori – Jack

+1

Grazie per le informazioni, ma a prescindere, perché il mio codice sopra è strano? – Aderis

+0

@JackWu: renderlo facoltativo significa che puoi impostarlo su nil più tardi se hai un motivo per farlo. – gnasher729

risposta

1

Questo errore si verifica con tutte le inout parametri e devono essere considerati un bug.

Il modo usuale con cui i parametri inout funzionano è che il loro getter viene chiamato una volta e il loro setter almeno una volta. In questo caso il getter restituisce un Int!:

let num: Int! = 0 
let num2 = num // is inferred to be of type Int! 

così la firma del getter/setter non è la stessa della funzione/operatore aspetta. Ma il compilatore dovrebbe implicitamente scartare il valore se viene assegnato ad un Int o superato in questo modo:

var num3 = 0 // is of type Int 
num3 = num // gets automatically unwrapped 

// also with functions 
func someFunc(i: Int) {} 
someFunc(num) // gets automatically unwrapped 

Nota a margine:

Quasi lo stesso errore si verifica se si vuole passare un Int a una funzione con una inout parametro di tipo Int!. Ma qui è ovvio perché questo non funziona (logicamente): il setter di un Int non prende mai un nil.

-3

Si sta utilizzando il tipo sbagliato Int!, utilizzare Int invece

+0

Lo sto usando in un ViewController, che non ha un metodo 'init()', e tutte le mie inizializzazioni sono fatte in 'viewDidLoad', quindi deve essere una sorta di opzionale, e non voglio renderlo un 'Int?' perché poi dovrei avere a che fare con punti interrogativi ovunque, e ha sempre un valore dopo il mio 'viewDidLoad' – Aderis

+0

fare l'inizializzazione nella riga di dichiarazione' var num = 0'. 'Int' è il tipo predefinito – vadian

+0

Grazie per le informazioni, ma a prescindere, perché il mio codice con l'opzionale è strano? – Aderis

Problemi correlati