Swift: функция с параметром по умолчанию перед параметром, отличным от значения по умолчанию

Скажем, у меня есть функция, которая имеет параметр без значения по умолчанию после параметра по умолчанию:

func f(first:Int = 100, second:Int){}

как я могу его вызвать и использовать значение по умолчанию для первого параметра?

Ответ 1

Текущий компилятор разрешает параметры по умолчанию в середине списка параметров.

screenshot of Playground

Вы можете вызвать функцию, подобную этой, если вы хотите использовать значение по умолчанию для параметра first:

f(1)

Если вы хотите указать новое значение для параметра first, используйте его внешнее имя:

f(first: 3, 1)

Документация объясняет, что параметрам со значением по умолчанию автоматически присваивается внешнее имя:

Swift предоставляет автоматическое внешнее имя для любого дефолтного параметра, который вы определяете, если вы не предоставляете внешнее имя самостоятельно. Автоматическое внешнее имя совпадает с локальным именем, как если бы вы написали хэш-символ перед локальным именем в вашем коде.

Ответ 2

У вас должны быть параметры по умолчанию в конце списка параметров.

func f(second:Int, first:Int = 100){}
f(10)

Поместите параметры со значениями по умолчанию в конце функций список параметров. Это гарантирует, что все вызовы функции будут использовать одинаковый порядок для их аргументов, отличных от дефолта, и дает понять, что одна и та же функция вызывается в каждом случае.

Ссылка на документацию

Ответ 3

В 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

Ответ 4

Если это метод в классе, вам нужно вызвать его так:

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