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


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

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

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

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 просто удаляет необязательную привязку, не проверяя значение по умолчанию.

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

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

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

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

test()
test(WithFlag: true)