Скажем, у меня есть функция с определением
func someInitialiser(paramA : String = "defaultA", paramB : Int = 23, paramC : Double = 99.99) {
//initialisation using parameters
}
Я не хочу, чтобы значения в функции были необязательными, поэтому использование значений по умолчанию для случая, когда параметр не задан.
Однако, когда я хочу вызвать функцию, у меня есть несколько значений, которые должны быть заданы в качестве параметров, которые действительно являются необязательными.
Насколько я знаю, вы не можете передать нулевое значение в функция и заставить его вернуться к значению по умолчанию, поскольку функция не принимает необязательный ввод.
Так что, мне кажется, единственный способ сделать это будет
if paramA == nil && paramB == nil && paramC == nil { someInitialiser() }
if paramA == nil && paramB == nil && paramC != nil { someInitialiser(paramC: paramC) }
if paramA == nil && paramB != nil && paramC == nil { someInitialiser(paramB: paramB) }
if paramA == nil && paramB != nil && paramC != nil { someInitialiser(paramB: paramB, paramC: paramC) }
if paramA != nil && paramB == nil && paramC == nil { someInitialiser(paramA: paramA) }
...
Это имеет до 2 ^ (количество параметров) возможных вызовов функций для тех, у кого больше параметров, поэтому явно не слишком приятно писать.
Было бы намного проще сделать что-то вроде
someInitialiser(paramA: paramA ?? NULL, paramB: paramB ?? NULL, paramC: paramC ?? NULL)
Чтобы значения были равны нулю, в функцию не передавались бы никакие параметры, так что она опирается на значения по умолчанию в определении.
Я знаю, что альтернативой является также предоставление Значения по умолчанию при вызове функции с использованием коалесценции, аналогичной приведенной выше, хотя было бы неплохо не повторять их вне определения.