Gdy ustawię wartość firstThing
domyślną, nil
to zadziała, bez wartości domyślnej nil
pojawia się błąd, że podczas wywoływania funkcji brakuje parametru.
Wpisując Int?
, myślałem, że jest to opcjonalne z domyślną wartością nil
, mam rację? A jeśli tak, dlaczego nie działa bez = nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
func test(firstThing: Int = 4)
: nie-Optional
parametr z wartością domyślną.Optional
Typ (czyli to, co?
w nazwie typu rozszerza się do) to typ wartości; „parametr opcjonalny” to niefortunna nazwa parametru, który może być obecny lub nie w wywołaniu funkcji, niezależnie od jego typu.Odpowiedzi:
Opcje i parametry domyślne to dwie różne rzeczy.
Opcjonalna to zmienna, która może być
nil
, to wszystko.Parametry domyślne używają wartości domyślnej, gdy pominiesz ten parametr, ta wartość domyślna jest określona w następujący sposób:
func test(param: Int = 0)
Jeśli określisz parametr, który jest opcjonalny, musisz go podać, nawet jeśli wartość, którą chcesz przekazać, to
nil
. Jeśli twoja funkcja wygląda takfunc test(param: Int?)
, nie możesz jej tak nazwaćtest()
. Mimo że parametr jest opcjonalny, nie ma wartości domyślnej.Można również połączyć dwa i mieć parametr, który pobiera opcjonalny gdzie
nil
jest wartością domyślną, tak:func test(param: Int? = nil)
.źródło
Argument domyślny umożliwia wywołanie funkcji bez przekazywania argumentu. Jeśli nie przekażesz argumentu, podawany jest argument domyślny. Więc używając twojego kodu, to ...
... jest dokładnie taki sam jak ten:
Jeśli pominiesz domyślny argument, taki jak ten ...
... wtedy nie możesz już tego robić ...
Jeśli to zrobisz, zostanie wyświetlony opisany błąd „brakujący argument”. Za każdym razem musisz przekazać argument, nawet jeśli ten argument to po prostu
nil
:źródło
Swift nie przypomina języków takich jak JavaScript, w których można wywołać funkcję bez przekazywania parametrów i nadal będzie ona wywoływana. Aby wywołać funkcję w Swift, musisz przypisać wartość do jej parametrów.
Wartości domyślne parametrów umożliwiają przypisanie wartości bez określania jej podczas wywoływania funkcji. Dlatego
test()
działa, gdy określisz wartość domyślną w deklaracji testu.Jeśli nie to, że wartość domyślną, należy podać wartość na połączenia:
test(nil)
.Poza tym, i nie jest to bezpośrednio związane z tym pytaniem, ale prawdopodobnie warte odnotowania, używasz sposobu "C ++" do radzenia sobie z potencjalnie zerowymi wskaźnikami, aby radzić sobie z możliwymi zerowymi opcjami w Swift. Poniższy kod jest bezpieczniejszy (szczególnie w oprogramowaniu wielowątkowym) i pozwala uniknąć wymuszonego rozpakowywania opcjonalnego:
źródło
Mylisz się
Optional
z domyślnym. AnOptional
akceptuje wartość lub zero. Posiadanie wartości domyślnej pozwala na pominięcie argumentu podczas wywoływania funkcji. Argument może mieć wartość domyślną zOptional
typem lub bez .Przykładowe wywołania z wyjściem:
Podsumowując:
Optional
może być nil lub może zawierać wystąpienie TypeOptional
i mają wartość domyślną, to można je pominąć w wywołaniu funkcji LUB może być uwzględnione i może mieć wartość zerową (np. Param1: nil)źródło
func getFilterNames(name: inout String){ }
, to zmiana przekazanej nazwy.w przypadku konieczności użycia parametru bool, wystarczy przypisać wartość domyślną.
wtedy możesz użyć bez lub z param:
źródło
„Parametr opcjonalny” oznacza „typ tego parametru jest opcjonalny”. Nie oznacza to: „Ten parametr jest opcjonalny i dlatego można go zignorować podczas wywoływania funkcji”.
Termin „parametr opcjonalny” wydaje się być mylący. Aby wyjaśnić, dokładniej jest powiedzieć „opcjonalny parametr typu” zamiast „opcjonalny parametr”, ponieważ słowo „opcjonalny” ma tutaj jedynie opisać typ wartości parametru i nic więcej.
źródło
Jeśli chcesz móc wywołać parametr
func
z lub bez parametru, możesz utworzyć sekundęfunc
o tej samej nazwie, która wywołuje drugą.teraz możesz wywołać funkcję o nazwie
test
bez lub bez parametru.źródło
Jest to trochę trudne, gdy próbujesz połączyć opcjonalny parametr i wartość domyślną tego parametru. Lubię to,
Te dwa są zupełnie przeciwnymi pomysłami. Gdy masz opcjonalny parametr typu, ale podajesz również wartość domyślną, nie jest on już typem opcjonalnym, ponieważ ma wartość domyślną. Nawet jeśli wartością domyślną jest zero, swift po prostu usuwa opcjonalne powiązanie bez sprawdzania, jaka jest wartość domyślna.
Dlatego zawsze lepiej nie używać wartości nil jako wartości domyślnej.
źródło
nil
).var foo: String; print(foo)
). Ale argument funkcji z wartością domyślną jest argumentem opcjonalnym (nie musisz go podawać w wywołaniu funkcji) i może być również typu Opcjonalnego (co pozwalanil
na przypisanie go nawet jako wartość domyślna).Wartość domyślna nie oznacza domyślnej wartości typu danych, tutaj wartość domyślna oznacza wartość zdefiniowaną w momencie definiowania funkcji. podczas definiowania zmiennej w funkcji musimy zadeklarować domyślną wartość zmiennej.
źródło