2016-05-18 31 views
33

Quando imposto firstThing come predefinito nil, funzionerà, senza il valore predefinito di nil, ricevo un errore che indica che è presente un parametro mancante quando si chiama la funzione.Parametro opzionale predefinito nella funzione Swift

Digitando Int? ho pensato che lo rendesse opzionale con un valore predefinito di nil, ho ragione? E se sì, perché non funziona senza lo = nil?

func test(firstThing: Int? = nil) { 
    if firstThing != nil { 
     print(firstThing!) 
    } 
    print("done") 
} 
test() 
+0

Si consideri che è possibile scrivere 'func test (firstThing: Int = 4)': un parametro non -Optional' con un valore predefinito. Il tipo 'Optional' (che è ciò che'? 'In un nome di tipo si espande in) è un tipo di valore; "parametro opzionale" è un nome sfortunato per un parametro che può o non può essere presente in una chiamata di funzione, indipendentemente dal suo tipo. – zneak

+0

Quale versione di Swift hai usato per testare questo codice? Il tuo codice funziona bene !! Opzionali sono solo un tipo e i parametri predefiniti funzionano bene come con un altro tipo in Swift –

risposta

53

Le opzioni e i parametri predefiniti sono due cose diverse.

Un Optional è una variabile che può essere nil, il gioco è fatto.

parametri di default utilizzare un valore predefinito quando si omette tale parametro, questo valore predefinito viene specificato come questo: func test(param: Int = 0)

Se si specifica un parametro che è un optional, è necessario fornire, anche se il il valore che si desidera passare è nil. Se la tua funzione è simile a questa func test(param: Int?), non puoi chiamarla così test(). Anche se il parametro è facoltativo, non ha un valore predefinito.

È inoltre possibile combinare i due e disporre di un parametro che accetta un valore opzionale dove nil è il valore predefinito, ad esempio func test(param: Int? = nil).

+2

"Se si specifica un parametro facoltativo, è necessario fornirlo". Ottimo, grazie Swift – andrewtweber

11

L'argomento predefinito consente di chiamare la funzione senza passare un argomento. Se non si passa l'argomento, viene fornito l'argomento predefinito. Quindi, utilizzando il codice, questo ...

test() 

... è esattamente lo stesso di questo:

test(nil) 

Se si lascia fuori l'argomento di default come questo ...

func test(firstThing: Int?) { 
    if firstThing != nil { 
     print(firstThing!) 
    } 
    print("done") 
} 

... allora non è più possibile fare questo ...

test() 

Se lo fai, otterrai l'errore "argomento mancante" che hai descritto. È necessario passare un argomento ogni volta, anche se questo argomento è solo nil:

test(nil) // this works 
8

Swift non è come linguaggi come JavaScript, in cui è possibile chiamare una funzione senza passare i parametri e sarà ancora chiamato. Quindi, per chiamare una funzione in Swift, è necessario per assegnare un valore ai suoi parametri.

I valori predefiniti per i parametri consentono di assegnare un valore senza specificarlo quando si chiama la funzione. Ecco perché test() funziona quando si specifica un valore predefinito nella dichiarazione del test.

Se non si include quel valore predefinito, è necessario fornire il valore della chiamata: test(nil).

Inoltre, e non direttamente correlato a questa domanda, ma probabilmente vale la pena di notare, si sta utilizzando il metodo "C++" per gestire eventuali puntatori nulli, per gestire possibili opzioni nul in Swift. Il seguente codice è più sicuro (soprattutto in multithreading software), e consente di evitare la scucitura forzata del optional:

func test(firstThing: Int? = nil) { 
    if let firstThing = firstThing { 
     print(firstThing) 
    } 
    print("done") 
} 
test() 
0

E 'po' difficile quando si tenta di coniugare parametro facoltativo e il valore predefinito per quel parametro. Mi piace,

func test(param: Int? = nil) 

Queste due idee sono completamente opposte. Quando si dispone di un parametro di tipo facoltativo ma si fornisce anche un valore predefinito, non è più un tipo facoltativo ora poiché ha un valore predefinito. Anche se il valore predefinito è zero, swift rimuove semplicemente l'associazione facoltativa senza verificare quale sia il valore predefinito.

Quindi è sempre meglio non utilizzare nil come valore predefinito.

0

"Parametro facoltativo" significa "il tipo di questo parametro è facoltativo". Non significa "Questo parametro è opzionale e, pertanto, può essere ignorato quando si chiama la funzione".

Il termine "parametro opzionale" sembra confondere. Per chiarire, è più corretto dire "parametro di tipo opzionale" invece di "parametro opzionale" poiché la parola "facoltativo" qui è solo intesa a descrivere il tipo di valore del parametro e nient'altro.

Problemi correlati