Как удобно передавать параметры, только если они не равны нулю в swift? - PullRequest
1 голос
/ 05 апреля 2020

Скажем, у меня есть функция с определением

func someInitialiser(paramA : String = "defaultA", paramB : Int = 23, paramC : Double = 99.99) {

    //initialisation using parameters

}

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

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

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

Так что, мне кажется, единственный способ сделать это будет

if paramA == nil && paramB == nil && paramC == nil { someInitialiser() }
if paramA == nil && paramB == nil && paramC != nil { someInitialiser(paramC: paramC) }
if paramA == nil && paramB != nil && paramC == nil { someInitialiser(paramB: paramB) }
if paramA == nil && paramB != nil && paramC != nil { someInitialiser(paramB: paramB, paramC: paramC) }
if paramA != nil && paramB == nil && paramC == nil { someInitialiser(paramA: paramA) }
...

Это имеет до 2 ^ (количество параметров) возможных вызовов функций для тех, у кого больше параметров, поэтому явно не слишком приятно писать.

Было бы намного проще сделать что-то вроде

someInitialiser(paramA: paramA ?? NULL, paramB: paramB ?? NULL, paramC: paramC ?? NULL)

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

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

Ответы [ 3 ]

3 голосов
/ 05 апреля 2020

Создайте две функции:

someInitialiser(paramA: String?, paramB: Int?) {
   someInitializer(paramA: paramA ?? "defaultA", paramB: paramB ?? 23)
}

someInitialiser(paramA: String, paramB: Int) {
   ...
}

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

0 голосов
/ 05 апреля 2020

Это расширение может быть полезным.

public extension Optional {

var isNil: Bool {
    switch self {
    case .none:
        return true
    default:
        return false
    }
}

var isSome: Bool {
    switch self {
    case .some:
        return true
    case .none:
        return false
    }
 }

}

let number: Int? = 10
print(number.isSome) // true
print(number.isNil) // false
0 голосов
/ 05 апреля 2020

Если я правильно понял проблему, вы должны сделать параметр функции необязательным, используя? подписать и использовать оператор Nil-Coalescing перед вызовом функции или оператора if (в зависимости от того, что вы предпочитаете)

    if yourParameter != nil {
         doSomething
    }

или используя

    yourParameter != nil ? assignValue : assign defaultValue
...