3

デフォルトの関数パラメーター値とオプションを組み合わせる適切な方法はありますか?関数呼び出しでパラメーターが指定されている場合、パラメーターは提供されたデフォルトの値を取りますが、その値は 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!
    }
}

この分野の他の言語機能を考えると、よりきちんとした解決策があるはずです。

4

1 に答える 1

15

どうですか:

class MyObj {

    var foobar:String

    init(foo: String?=nil) {
        self.foobar = foo ?? "hello"
    }
}
于 2014-11-28T14:48:19.550 に答える