Скажем, у меня есть функция, которая имеет параметр без значения по умолчанию после параметра по умолчанию:
func f(first:Int = 100, second:Int){}
как я могу его вызвать и использовать значение по умолчанию для первого параметра?
Скажем, у меня есть функция, которая имеет параметр без значения по умолчанию после параметра по умолчанию:
func f(first:Int = 100, second:Int){}
как я могу его вызвать и использовать значение по умолчанию для первого параметра?
Текущий компилятор разрешает параметры по умолчанию в середине списка параметров.
Вы можете вызвать функцию, подобную этой, если вы хотите использовать значение по умолчанию для параметра first
:
f(1)
Если вы хотите указать новое значение для параметра first
, используйте его внешнее имя:
f(first: 3, 1)
Документация объясняет, что параметрам со значением по умолчанию автоматически присваивается внешнее имя:
Swift предоставляет автоматическое внешнее имя для любого дефолтного параметра, который вы определяете, если вы не предоставляете внешнее имя самостоятельно. Автоматическое внешнее имя совпадает с локальным именем, как если бы вы написали хэш-символ перед локальным именем в вашем коде.
У вас должны быть параметры по умолчанию в конце списка параметров.
func f(second:Int, first:Int = 100){}
f(10)
Поместите параметры со значениями по умолчанию в конце функций список параметров. Это гарантирует, что все вызовы функции будут использовать одинаковый порядок для их аргументов, отличных от дефолта, и дает понять, что одна и та же функция вызывается в каждом случае.
В Swift 3:
func defaultParameterBefore(_ x: Int = 1, y: Int ) {}
Вызов
defaultParameterBefore(2)
поднимет эту ошибку
error: missing argument for parameter 'y' in call
Единственное исключение:
Например:
func defaultParameterBetween(_ x: Int, _ y: Bool = true, _ z: String) {
if y {
print(x)
} else
z()
}
}
// error: missing argument for parameter #3 in call
// defaultParameterWithTrailingClosure(1, { print(0) }
// Trailing closure does work, though.
func defaultParameterWithTrailingClosure(_ x: Int, y: Bool = true,
_ z: () -> Void) {
if y {
print(x)
} else {
z()
}
}
defaultParameterWithTrailingClosure(1) { print(0) }
быстрая версия: DEVELOPMENT-SNAPSHOT-2016-04-12
Если это метод в классе, вам нужно вызвать его так:
class Test
{
func f(first:Int = 100, second:Int)
{
println("first is \(first)")
println("second is \(second)")
}
func other()
{
f(second: 4)
f(first: 30, second: 5)
//f(4) will not compile, and neither will f(9,12)
}
}
Если функция f является глобальной, вам необходимо вызвать ее так:
f(4)
f(first: 30, 5)
Отпечатки:
first is 100
second is 4
first is 30
second is 5