swift中只有不为nil的参数才方便传?

How to conveniently pass parameters only if they are not nil in swift?

假设我有一个函数定义

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

    //initialisation using parameters

}

我不希望函数中的值是可选的,因此在没有给出参数的情况下使用默认值。

但是,当我想调用该函数时,我有一堆值作为参数给出,这些值确实是可选的。

据我所知,您不能将 nil 值传递给函数并让它返回默认值,因为该函数不接受可选输入。

所以在我看来唯一的方法是

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)

因此,如果值为 nil,它根本不会向函数传递任何参数,因此它依赖于定义中的默认值。

我知道另一种方法是在调用函数时也提供默认值,使用与上面类似的合并,尽管不必在定义之外重复它们会很好。

创建两个函数:

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

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

你真是想多了。如果您想要 nil 的默认值,那么 ?? 是正确的解决方案。如果你不想在函数外使用它,那么你必须让参数可选并在内部使用??

如果我理解正确,你应该使用 ?在调用函数或 if 语句(无论您喜欢哪个)之前签署并使用 Nil-Coalescing 运算符

    if yourParameter != nil {
         doSomething
    }

或使用

    yourParameter != nil ? assignValue : assign defaultValue

这个扩展很有用。

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