Подтвердить что ты не робот

Необязательный параметр по умолчанию в функции Swift

Когда я устанавливаю firstThing по умолчанию nil, это будет работать без значения по умолчанию nil. Я получаю сообщение об ошибке при вызове функции.

Набрав Int?, я подумал, что он сделал это необязательным со значением по умолчанию nil, правильно? И если да, то почему он не работает без = nil?

func test(firstThing: Int? = nil) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
test()
4b9b3361

Ответ 1

Опционы и параметры по умолчанию - две разные вещи.

Необязательный - это переменная, которая может быть nil, что она.

Параметры по умолчанию используют значение по умолчанию при опускании этого параметра, это значение по умолчанию указано следующим образом: func test(param: Int = 0)

Если вы укажете параметр, который является необязательным, вы должны его предоставить, даже если значение, которое вы хотите передать, nil. Если ваша функция выглядит как func test(param: Int?), вы не можете вызвать ее так test(). Хотя параметр не является обязательным, он не имеет значения по умолчанию.

Вы также можете комбинировать два и иметь параметр, который принимает необязательный параметр, где nil - значение по умолчанию, например: func test(param: Int? = nil).

Ответ 2

Аргумент по умолчанию позволяет вызывать функцию без передачи аргумента. Если вы не передадите аргумент, будет предоставлен аргумент по умолчанию. Поэтому, используя ваш код, этот...

test()

... точно такой же:

test(nil)

Если вы оставите аргумент по умолчанию, подобный этому...

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

... тогда вы больше не можете этого делать...

test()

Если вы это сделаете, вы получите описанную вами ошибку "отсутствующего аргумента". Вы должны передавать аргумент каждый раз, даже если этот аргумент просто nil:

test(nil)   // this works

Ответ 3

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

Значения по умолчанию для параметров позволяют присваивать значение без указания его при вызове функции. Поэтому test() работает, когда вы указываете значение по умолчанию в декларации теста.

Если вы не включили это значение по умолчанию, вам необходимо указать значение для вызова: test(nil).

Кроме того, и напрямую не связанный с этим вопросом, но, вероятно, стоит отметить, что вы используете способ "С++" для работы с возможными нулевыми указателями, чтобы иметь дело с возможными опциями nil в Swift. Следующий код более безопасен (особенно в многопоточном программном обеспечении), и он позволяет избежать принудительной разворачивания опционального:

func test(firstThing: Int? = nil) {
    if let firstThing = firstThing {
        print(firstThing)
    }
    print("done")
}
test()

Ответ 4

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

Термин "необязательный параметр" выглядит сбивающим с толку. Чтобы уточнить, точнее будет сказать "необязательный параметр типа" вместо "необязательный параметр", так как слово "необязательный" здесь предназначено только для описания типа значения параметра и ничего более.

Ответ 5

Вы связываете Optional с наличием по умолчанию. Optional принимает либо значение, либо ноль. Наличие значения по умолчанию позволяет опустить аргумент при вызове функции. Аргумент может иметь значение по умолчанию с типом 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

Подвести итоги:

  • Типа с? (например, String?) Optional может быть ноль или может содержать экземпляр типа
  • Аргумент со значением по умолчанию может быть опущен при вызове функции, и будет использоваться значение по умолчанию
  • Если и Optional и имеет значение по умолчанию, то он может быть исключен из вызова функции ИЛИ может быть включен и может иметь значение nil (например, param1: nil)

Ответ 6

в случае, если вам нужно использовать параметр bool, вам нужно просто назначить значение по умолчанию.

func test(WithFlag flag: Bool = false){.....}

тогда вы можете использовать без или с параметром:

test()
test(WithFlag: true)

Ответ 7

Если вы хотите иметь возможность вызывать func с параметром или без него, вы можете создать вторую func с тем же именем, которая вызывает другую func.

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

func test() {
    test(firstThing: nil)
}

теперь вы можете вызывать функцию с именем test без или без параметра.

// both work
test()
test(firstThing: 5)

Ответ 8

Немного сложно, когда вы пытаетесь объединить необязательный параметр и значение по умолчанию для этого параметра. Как это,

func test(param: Int? = nil)

Эти два абсолютно противоположные идеи. Когда у вас есть необязательный параметр типа, но вы также предоставляете ему значение по умолчанию, теперь он больше не является необязательным типом, поскольку он имеет значение по умолчанию. Даже если значение по умолчанию равно нулю, swift просто удаляет необязательную привязку, не проверяя значение по умолчанию.

Поэтому всегда лучше не использовать nil в качестве значения по умолчанию.