Необязательный параметр по умолчанию в функции Swift
когда я поставил firstThing
по умолчанию nil
это будет работать, без значение по умолчанию nil
Я получаю сообщение об ошибке, что при вызове функции отсутствует параметр.
введя Int?
Я думал, что это сделал его необязательным значением по умолчанию nil
, Я прав? И если да, то почему он не работает без = nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
7 ответов:
опции и параметры по умолчанию-это две разные вещи.
необязательной является переменная, которая может быть
nil
, вот и все.параметры по умолчанию использовать по умолчанию значение, когда вы опускаете этот параметр, это значение по умолчанию указан такой:
func test(param: Int = 0)
если вы укажете параметр, который является необязательным, вы должны предоставить его, даже если значение, которое вы хотите передать,
nil
. Если ваша функция выглядит такfunc test(param: Int?)
, вы не можете назвать это вот такtest()
. Даже если параметр является необязательным, он не имеет значения по умолчанию.вы также можете объединить эти два и иметь параметр, который принимает необязательный where
nil
- Это значение по умолчанию, например:func test(param: Int? = nil)
.
аргумент по умолчанию позволяет вызывать функцию без передачи аргумента. Если аргумент не передается, то предоставляется аргумент по умолчанию. Итак, используя ваш код, это...
test()
...точно так же, как этот:
test(nil)
если вы опустите аргумент по умолчанию, как это...
func test(firstThing: Int?) { if firstThing != nil { print(firstThing!) } print("done") }
...тогда вы больше не можете этого делать...
test()
если вы это сделаете, вы получите ошибку "отсутствующий аргумент", которую вы описали. Вы должен передавать аргумент каждый раз, даже если этот аргумент просто
nil
:test(nil) // this works
Swift не похож на такие языки, как JavaScript, где вы можете вызвать функцию без передачи параметров, и она все равно будет вызвана. Итак, чтобы вызвать функцию в Swift, вы нужно присвоить значение его параметрам.
значения по умолчанию для параметров позволяют присвоить значение без указания его при вызове функции. Вот почему
test()
работает, когда вы указать значение по умолчанию в объявлении теста.Если вы не включаете это значение по умолчанию значение, вы должны предоставить значение на вызов:
test(nil)
.кроме того, и не имеет прямого отношения к этому вопросу, но, вероятно, стоит отметить, что вы используете способ "C++" для работы с возможно нулевыми указателями, для работы с возможными nil optionals в Swift. Следующий код является более безопасным (особенно в многопоточном программном обеспечении), и это позволяет избежать принудительного разворачивания дополнительного:
func test(firstThing: Int? = nil) { if let firstThing = firstThing { print(firstThing) } print("done") } test()
" необязательный параметр "означает"тип этого параметра является необязательным". Это не означает ,что"этот параметр является необязательным и, следовательно, может быть проигнорирован при вызове функции".
термин "необязательный параметр" кажется запутанным. Чтобы уточнить, более точно сказать "необязательный параметр типа" вместо "необязательного параметра", поскольку слово "необязательный" здесь предназначено только для описания типа значения параметра и ничего больше.
вы сливаетесь
Optional
установить по умолчанию. АнOptional
принимает значение или nil. Наличие значения по умолчанию позволяет опустить аргумент при вызове функции. Аргумент может иметь значение по умолчанию с или без бытияOptional
тип.func someFunc(param1: String?, param2: String = "default value", param3: String? = "also has default value") { print("param1 = \(param1)") print("param2 = \(param2)") print("param3 = \(param3)") }
пример вызовов с выходом:
someFunc(param1: nil, param2: "specific value", param3: "also specific value") param1 = nil param2 = specific value param3 = Optional("also specific value") someFunc(param1: "has a value") param1 = Optional("has a value") param2 = default value param3 = Optional("also has default value") someFunc(param1: nil, param3: nil) param1 = nil param2 = default value param3 = nil
подведем итоги:
- тип с ? (например, строка?) является
Optional
может быть nil или может содержать экземпляр Типа
это немного сложно, когда вы пытаетесь объединить необязательный параметр и значение по умолчанию для этого параметра. Вот так,
func test(param: Int? = nil)
эти две совершенно противоположные идеи. Если у вас есть необязательный параметр типа, но вы также предоставляете ему значение по умолчанию, он больше не является необязательным типом, поскольку он имеет значение по умолчанию. Даже если значение по умолчанию равно nil, swift просто удаляет необязательную привязку, не проверяя значение по умолчанию.
Так что всегда лучше не делать используйте ноль в качестве значения по умолчанию.