Необов’язковий параметр у функції Swift


107

Коли я встановлю firstThingза замовчуванням, nilце буде працювати, без значення за замовчуванням у nilмене з’являється помилка про відсутність параметра при виклику функції.

Ввівши текст, Int?я подумав, що це робить його необов'язковим із значенням за замовчуванням nil, чи я прав? І якщо так, то чому це не працює без = nil?

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

1
Подумайте, що ви можете записати func test(firstThing: Int = 4): не Optionalпараметр зі значенням за замовчуванням. OptionalТип (який є те , що ?в імені типу розширюється в) являє собою тип значення; "необов'язковий параметр" - невдале ім'я параметра, який може бути або не може бути присутнім у виклику функції, незалежно від його типу.
zneak

Яку версію Swift ви використовуєте для тестування цього коду? Ваш код прекрасно працює !! Необов’язковий лише тип, а параметри за замовчуванням чудово працюють, як і для іншого типу в Swift
Віктор Зіґлер

Відповіді:


210

Необов’язкові параметри та параметри за замовчуванням - це дві різні речі.

Необов’язкова - це може бути змінна nil, ось так.

Параметри за замовчуванням використовують значення за замовчуванням, коли ви пропускаєте цей параметр, це значення за замовчуванням задається так:func test(param: Int = 0)

Якщо ви вказуєте параметр, який є необов’язковим, ви повинні надати його, навіть якщо значення, яке ви хочете передати, є nil. Якщо ваша функція виглядає так func test(param: Int?), ви не можете її назвати так test(). Незважаючи на те, що параметр необов’язковий, він не має значення за замовчуванням.

Крім того, можна об'єднати два і мати параметр , який приймає необов'язковий , де nilце значення за замовчуванням, наприклад: func test(param: Int? = nil).


27
Msgstr "Якщо ви вказуєте параметр, який є необов'язковим, ви повинні його надати".
Чудово

8
@andrewtweber Ваш гумор цінується, але для новачків я подумав, що може бути корисним уточнити, що "Необов’язково" стосується надання предмета чи цінності. Не потрібно цього робити, натомість можна надати нуль (що означає відсутність об'єкта чи значення). Ви просто повинні вирішити, який варіант ви обираєте.
JD Sandifer

23

Аргумент за замовчуванням дозволяє викликати функцію без передачі аргументу. Якщо ви не передаєте аргумент, аргумент за замовчуванням надається. Отже, використовуючи свій код, це ...

test()

... точно таке, як це:

test(nil)

Якщо ви не залишите аргумент за замовчуванням, як цей ...

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

... тоді ти вже не можеш цього робити ...

test()

Якщо ви це зробите, ви отримаєте описану вами помилку "відсутній аргумент". Ви повинні кожен раз передавати аргументи, навіть якщо цей аргумент є просто nil:

test(nil)   // this works

18

Swift - це не такі мови, як JavaScript, де ви можете викликати функцію, не передаючи параметри, і вона все одно буде викликатися. Отже, щоб викликати функцію в Swift, потрібно призначити значення її параметрам.

Значення за замовчуванням для параметрів дозволяють призначити значення, не вказуючи його під час виклику функції. Ось чому test()працює, коли ви визначаєте значення за замовчуванням у декларації тесту.

Якщо ви не включають значення за замовчуванням, ви повинні надати значення на виклик: test(nil).

Крім того, і безпосередньо не пов'язане з цим питанням, але, мабуть, варто зазначити, ви використовуєте спосіб "C ++" для вирішення можливих нульових покажчиків для розгляду можливих варіантів нуля в Swift. Наступний код є більш безпечним (особливо в багатопотоковому програмному забезпеченні), і він дозволяє уникнути примусового розгортання необов'язкового:

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

7

Ви зіштовхуєтесь 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може бути нульовим або може містити екземпляр Type
  • Аргумент зі значенням за замовчуванням може бути пропущено з виклику до функції, і буде використано значення за замовчуванням
  • Якщо у обох Optionalі за замовчуванням, то він може бути пропущений з виклику функції АБО може бути включений і може надати нульове значення (наприклад, param1: nil)

Чи можу я додати параметр за замовчуванням як змінну, як let або var? Спасибі
Йогеш Патель

@YogeshPatel Не впевнений, що ти маєш на увазі.
Чак Крутсінгер

як var myName = "Йогеш". Тепер моя функція подібна 1. func getFilterNames (name: string = myName) {} такий підхід для мене не працює. 2. func getFilterNames (name: string = "Yogesh") {} цей підхід працює для мене. Але я хочу спочатку, щоб ви могли, будь ласка, допомогти мені досягти цього. Дуже дякую!
Йогеш Патель

@YogeshPatel Я думаю, що ви можете захотіти - func getFilterNames(name: inout String){ }це дозволить вам змінити ім'я, яке було передано.
Чак Крутсінгер,

Ні, сер. я не хочу змінювати параметр. Я просто хочу надати моєму параметру значення за замовчуванням, але не як статичне "Йогеш". я хочу зробити так, як нехай так називається динамічний функція name = "Yogesh" getFilterNames (name: string = name). отримати це, сер? Дякую!
Йогеш Патель

4

у випадку, якщо вам потрібно використовувати параметр bool, вам потрібно просто призначити значення за замовчуванням.

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

тоді ви можете користуватися без або з парамером:

test() //here flag automatically has the default value: false
test(WithFlag: true) //here flag has the value: true

Для людей, які спростовують це, ви можете виправити неправильну річ, натомість інші зрозуміють це.
Нііб Фуда

3

"Необов'язковий параметр" означає "тип цього параметра необов'язковий". Це не означає "Цей параметр є необов'язковим, і, отже, його можна ігнорувати під час виклику функції".

Термін "необов'язковий параметр" видається заплутаним. Для уточнення, точніше сказати "необов'язковий параметр типу" замість "необов'язковий параметр", оскільки слово "необов'язковий" тут призначене лише для опису типу значення параметра та нічого іншого.


0

Якщо ви хочете мати можливість зателефонувати 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)

Чому б ви визначили додаткову функцію, коли ви могли просто вказати нуль як значення за замовчуванням для параметра?
Пітер Шорн

-1

Мало складно, коли ви намагаєтеся поєднати необов'язковий параметр і значення за замовчуванням для цього параметра. Подобається це,

func test(param: Int? = nil)

Ці дві абсолютно протилежні ідеї. Якщо у вас є необов'язковий параметр типу, але ви також надаєте йому значення за замовчуванням, це вже не необов'язковий тип, оскільки він має значення за замовчуванням. Навіть якщо за замовчуванням дорівнює нулю, swift просто видаляє необов'язкове прив'язування, не перевіряючи, що таке значення за замовчуванням.

Тому завжди краще не використовувати нуль як значення за замовчуванням.


1
Це неправильно. Немає нічого поганого в тому, що опція має значення за замовчуванням (навіть nil).
Брайан Кендіг

те, що я говорю, що колись змінна має значення за замовчуванням, це не є необов'язковим у тому сенсі, що вона завжди матиме значення.
Shubham Naik

1
Це неправда, і я не впевнений, що ви намагаєтесь описати. Я думаю, ви правильно говорите, що як тільки змінна має присвоєне їй значення, вона завжди буде присвоюватися; ви не можете скасувати його призначення (як і не хотіли б), якщо ви не розімкнете його. І Swift видасть вам помилку компіляції, якщо ви спробуєте використати змінну, перш ніж вона має значення (як у var foo: String; print(foo)). Але аргумент функції зі значенням за замовчуванням є необов'язковим аргументом (вам не потрібно передавати його у виклику функції), він також може бути вибору Факультативу (дозволяючи nilпризначити його, навіть як значення за замовчуванням).
Брайан Кендіг

Необов’язковий по суті є об'єднанням типу <Тип | Nil>, тобто може мати вказаний тип або тип Nil. (Якщо припустити, що у Швидкого були Спілки, що це не так, але тут ми говоримо концептуально). так Int? = нуль - це прекрасно.
Shayne

-1

Значення за замовчуванням не означає значення за замовчуванням типу даних. Тут середнє значення за замовчуванням, визначене на момент визначення функції. ми повинні оголосити значення за замовчуванням змінної, визначаючи змінну у функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.