Quando eu definir firstThing
como padrão, nil
isso funcionará, sem o valor padrão de nil
, recebo um erro informando que há um parâmetro ausente ao chamar a função.
Ao digitar Int?
, pensei que era opcional com um valor padrão de nil
, estou certo? E se sim, por que não funciona sem o = nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
func test(firstThing: Int = 4)
: um não-Optional
parâmetro com um valor padrão. OOptional
tipo (que é o que?
em um nome de tipo se expande) é um tipo de valor; "parâmetro opcional" é um nome infeliz para um parâmetro que pode ou não estar presente em uma chamada de função, independentemente de seu tipo.Respostas:
Opcionais e parâmetros padrão são duas coisas diferentes.
Um opcional é uma variável que pode ser
nil
, é isso.Os parâmetros padrão usam um valor padrão quando você omite esse parâmetro, este valor padrão é especificado assim:
func test(param: Int = 0)
Se você especificar um parâmetro opcional, deverá fornecê-lo, mesmo que o valor que deseja passar seja
nil
. Se sua função for assimfunc test(param: Int?)
, você não poderá chamá-la assimtest()
. Embora o parâmetro seja opcional, ele não possui um valor padrão.Você também pode combinar os dois e ter um parâmetro que leva um opcional que
nil
é o valor padrão, como este:func test(param: Int? = nil)
.fonte
O argumento padrão permite que você chame a função sem passar um argumento. Se você não passar o argumento, o argumento padrão será fornecido. Então, usando seu código, isso ...
... é exatamente o mesmo que este:
Se você deixar o argumento padrão como este ...
... então você não pode mais fazer isso ...
Se o fizer, obterá o erro "argumento ausente" que descreveu. Você deve passar um argumento todas as vezes, mesmo que esse argumento seja apenas
nil
:fonte
Swift não é como linguagens como JavaScript, onde você pode chamar uma função sem passar os parâmetros e ela ainda será chamada. Portanto, para chamar uma função em Swift, você precisa atribuir um valor a seus parâmetros.
Os valores padrão dos parâmetros permitem que você atribua um valor sem especificá-lo ao chamar a função. É por isso que
test()
funciona quando você especifica um valor padrão na declaração do teste.Se você não incluir esse valor padrão, você precisa fornecer o valor na chamada:
test(nil)
.Além disso, e não diretamente relacionado a esta questão, mas provavelmente vale a pena notar, você está usando a maneira "C ++" de lidar com ponteiros possivelmente nulos, para lidar com possíveis opcionais nulos em Swift. O código a seguir é mais seguro (especialmente em software multithreading) e permite que você evite o desembrulhamento forçado do opcional:
fonte
Você está confundindo
Optional
com um padrão. UmOptional
aceita um valor ou nulo. Ter um padrão permite que o argumento seja omitido na chamada da função. Um argumento pode ter um valor padrão com ou sem ser doOptional
tipo.Chamadas de exemplo com saída:
Para resumir:
Optional
pode ser nulo ou pode conter uma instância de TipoOptional
e tiver o padrão, ele pode ser omitido da chamada de função OU pode ser incluído e pode ser fornecido com um valor nulo (por exemplo, param1: nulo)fonte
func getFilterNames(name: inout String){ }
que você modifique o nome que foi passado."Parâmetro opcional" significa "o tipo deste parâmetro é opcional". Isso não significa "Este parâmetro é opcional e, portanto, pode ser ignorado ao chamar a função".
O termo "parâmetro opcional" parece confuso. Para esclarecer, é mais preciso dizer "parâmetro de tipo opcional" em vez de "parâmetro opcional", pois a palavra "opcional" aqui se destina apenas a descrever o tipo de valor do parâmetro e nada mais.
fonte
caso você precise usar um parâmetro bool, basta atribuir o valor padrão.
então você pode usar sem ou com o parâmetro:
fonte
Se você quiser chamar o
func
com ou sem o parâmetro, você pode criar um segundofunc
com o mesmo nome que chama o outro.agora você pode chamar uma função chamada
test
sem ou sem o parâmetro.fonte
É um pouco complicado quando você tenta combinar parâmetro opcional e valor padrão para esse parâmetro. Como isso,
Esses dois são ideias completamente opostas. Quando você tem um parâmetro de tipo opcional, mas também fornece um valor padrão para ele, ele não é mais um tipo opcional, pois tem um valor padrão. Mesmo se o padrão for nulo, o swift simplesmente remove a ligação opcional sem verificar qual é o valor padrão.
Portanto, é sempre melhor não usar nil como valor padrão.
fonte
nil
).var foo: String; print(foo)
). Mas um argumento de função com um valor padrão é um argumento opcional (você não precisa passá-lo na chamada de função) e também pode ser do tipo Opcional (permitindonil
ser atribuído a ele, mesmo como o valor padrão).O valor padrão não significa o valor padrão do tipo de dados. Aqui, o valor padrão significa o valor definido no momento da definição da função. temos que declarar o valor padrão da variável enquanto definimos a variável na função.
fonte