【发布时间】:2020-07-17 11:54:50
【问题描述】:
假设我有一个有定义的函数
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,它将根本不向函数传递任何参数,因此它依赖于定义中的默认参数。
我知道另一种方法是在调用函数时也提供默认值,使用类似于上面的合并,尽管不必在定义之外重复它们会很好。
【问题讨论】:
-
在 Swift 中没有办法说
paramA: default。有Optional<Wrapped>.map(_:)和Optional<Wrapped>.flatMap(_:),但这可能没什么用。
标签: swift optional optional-parameters optional-arguments