传入值为 nil 的函数参数的默认值

Posted

技术标签:

【中文标题】传入值为 nil 的函数参数的默认值【英文标题】:Default values for function parameters where value passed in is nil 【发布时间】:2014-11-28 14:41:48 【问题描述】:

有没有一种巧妙的方法来组合默认函数参数值和可选值,以便在函数调用中指定参数时,参数采用提供的默认值,但它的值是 nil?

例如:

class MyObj 

    var foobar:String

    init(foo: String?="hello") 
        self.foobar = foo!
    


let myObj = MyObj() // standard use of default values - don't supply a value at all

println(myObj.foobar) // prints "hello" as expected when parameter value is not supplied

var jimbob: String? // defaults to nil

...

// supply a value, but it is nil
let myObj2 = MyObj(foo: jimbob) // <<< this crashes with EXC_BAD_INSTRUCTION due to forced unwrap of nil value

println(myObj2.foobar)

...或者是为成员常量/变量提供默认值的最佳选择,然后仅在向构造函数提供值时才更改它们,如下所示:

let foobar:String = "hello"

init(foo: String?) 
    if foo != nil 
       self.foobar = foo!
    

鉴于该领域的其他语言特性,感觉应该有一个更简洁的解决方案。

【问题讨论】:

【参考方案1】:

怎么样:

class MyObj 

    var foobar:String

    init(foo: String?=nil) 
        self.foobar = foo ?? "hello"
    

【讨论】:

Apple Swift iBook 中标题为“Nil Coalescing Operator”的部分很好地解释了?? 是什么以及它在内部是如何工作的。

以上是关于传入值为 nil 的函数参数的默认值的主要内容,如果未能解决你的问题,请参考以下文章

js函数

ES6 函数参数的默认值

python--偏函数

python中偏函数

函数默认参数和rest

函数默认参数和rest