2016-03-03 10 views
10

Date un'occhiata a questa dichiarazione from Apple document:Perché dovresti usare un tipo facoltativo per una costante con valore?

let optionalInt: Int? = 9 

Perché si utilizzare Int? come tipo per questa costante? Sai che non può essere nil mentre stai assegnando il valore 9 ad esso? Lo scopo di un tipo facoltativo (come ho capito) è di essere in grado di contenere nil. Non è necessario per tenere premuto nil in questa istruzione. Qualcuno potrebbe spiegare?

+1

Potresti collegare la pagina del documento di Apple in cui hai trovato quella riga di codice, per favore? Questo ci darebbe un contesto per rispondere in modo più efficiente. – RaphBlanchet

+1

@RaphBlanchet L'ho trovato; [viene utilizzato come esempio a riga singola quando si introducono Optionals] (https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson1.html#//apple_ref/doc/uid/TP40015214-CH3-SW1). –

+0

Ecco un collegamento al documento: https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson1.html # // apple_ref/doc/uid/TP40015214-CH3-SW1 Cerca "optionalInt". È solo un esempio di una riga, ma mi aspetto che gli esempi abbiano senso. –

risposta

5

Ho trovato un caso in cui è possibile utilizzarlo. È un po 'allungato, ma ci siamo.

Una ragione per l'utilizzo di let x: Int? = whatever è se si dispone di una funzione di sovraccarico in cui i parametri sono tipi diversi solo nella misura in cui uno è facoltativo. Ad esempio:

Se si desidera garantire il richiamo del secondo sovraccarico, è necessario rendere esplicitamente un parametro facoltativo, ad es.

let y = 5 
doSomething(y) // prints 5 is an Int 

let z: Int? = 6 
doSomething(z) // prints Optional(6) is an optional 

Devo ancora vedere qualcosa di simile nella vita reale.

Per quanto riguarda la documentazione Apple, è solo un semplice esempio.

+1

Questo è un po 'troppo lungo, ma prima potremmo trovare una ragione migliore per usare let x: Int? = qualunque cosa, questa è la migliore risposta finora. Forse, non c'è una buona ragione per questo. Apple ha appena illustrato un cattivo esempio. –

1

Un paio di idee:

si Supponendo hanno un metodo

func foo(xValue: Int?)->Int? { 
    // some logic 
} 

Forse si vuole definire il vostro costante per corrispondere esattamente alla definizione del metodo.

let optionalInt: Int? = 9 
let fooVal = foo(optionalInt) 

Or (cambiare il vostro let dichiarazione iniziale), il valore della costante è determinata da una funzione che restituisce un opzionale

let optionalInt: Int? = foo(nil) 
+0

Nell'esempio di cui sopra, puoi chiamare foo con una costante Int? diamo nonOptionalInt: int = 9 lasciare fooVal = foo (nonOptionalInt) Se non è possibile chiamare foo in questo modo, allora AgRizzo ha fornito un motivo valido per dichiarare una costante con un valore come optional. Qualcuno può commentare? –

+0

Ho appena eseguito un esperimento. Per la funzione foo (xValue: Int?), Se si passa a foo un valore di Type Int come parametro, funziona comunque. Quindi, AgRizzo non ha fornito un motivo valido per la mia domanda. –

+0

@AndrewF. - Ti ho fornito DUE ragioni. Potresti non apprezzare le mie ragioni ma non hai dimostrato che le mie ragioni non erano valide. Hai dimostrato che un Int può essere implicitamente proiettato su un Int Opzionale. – AgRizzo

3

penso che questa particolare parte del documento Mele ha lo scopo di illustrare semplicemente la concetto di optionals e nient'altro. Probabilmente usano let per evitare di iniziare sempre con la dichiarazione delle proprietà/variabili let e modificarle solo su var se è necessario esplicitamente modificare i loro valori.

Per quanto riguarda la domanda, perché si dovrebbe dichiarare let foo: Int? = 9 e non solo let foo = 9. Beh, non riesco davvero a immaginare dove sarebbe stato necessario. Anche se alcune API prevedono un Int?, puoi ancora passare una variabile di tipo Int a tale API e Swift lo convertirà implicitamente per te. Forse, se lo si passa a una funzione generica e si desidera utilizzare la versione Int? per quella generica, si vorrà farlo, ma è già troppo accademico avere un uso pratico.

+0

Questa è la risposta corretta. Non è mai meglio creare un optional quando si sa che il valore non sarà mai 'nullo'. Anche l'esempio inverosimile in altre risposte sarebbe meglio con un cast esplicito quando necessario. – Sulthan