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
假设我有一个函数定义
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