firstThing
をデフォルトのnil
に設定すると、これは機能しますが、デフォルト値のnil
がなくても、関数を呼び出すときにパラメーターがないというエラーが表示されます。
Int?
と入力することで、デフォルト値のnil
でオプションにしたと思いますが、正しいですか?もしそうなら、なぜ= nil
がなければうまくいかないのでしょうか。
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
オプションとデフォルトパラメータは、2つの異なる点があります。
Optionalはnil
になることができる変数です、それだけです。
デフォルトのパラメーターは、そのパラメーターを省略するとデフォルトの値を使用します。このデフォルト値は、次のように指定されます。func test(param: Int = 0)
オプションのパラメータを指定した場合は、渡したい値がnil
であっても指定する必要があります。あなたの関数がこのfunc test(param: Int?)
のように見えるならば、あなたはこのtest()
のようにそれを呼ぶことができません。パラメータはオプションですが、デフォルト値はありません。
この2つを組み合わせて、nil
がデフォルト値のfunc test(param: Int? = nil)
のように、省略可能なパラメーターを使用することもできます。
デフォルトの引数を使用すると、引数を渡さずに関数を呼び出すことができます。引数を渡さないと、デフォルトの引数が与えられます。だから、あなたのコードを使用して、これ...
test()
...これはまったく同じです。
test(nil)
このようにデフォルトの引数を省略すると...
func test(firstThing: Int?) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
...それからあなたはもうこれを行うことはできません...
test()
そうした場合、あなたはあなたが説明した "missing argument"エラーを受け取るでしょう。たとえその引数が単なるnil
であっても、毎回引数を渡さなければなりません:
test(nil) // this works
SwiftはJavaScriptのような言語には似ていません。そこでは、パラメータを渡さずに関数を呼び出すことができ、それでも呼び出されます。そのため、Swiftで関数を呼び出すには、そのパラメータに値を代入するために必要を使用します。
パラメータのデフォルト値を使用すると、関数を呼び出すときに値を指定せずに値を割り当てることができます。テストの宣言でデフォルト値を指定したときにtest()
が機能するのはそのためです。
そのデフォルト値を含めない場合は、呼び出し時に値を提供する必要があります:test(nil)
。
また、この質問に直接関連するわけではありませんが、おそらく注意する価値がありますが、Swiftで可能性のあるnilオプションを処理するために、nullポインタを処理する「C++」方法を使用しています。次のコードはより安全で(特にマルチスレッドソフトウェアで)、オプションの強制的な展開を避けることができます。
func test(firstThing: Int? = nil) {
if let firstThing = firstThing {
print(firstThing)
}
print("done")
}
test()
「オプションパラメータ」は「このパラメータの種類はオプションです」という意味です。 「このパラメータはオプションなので、この関数を呼び出すときに無視することができます」という意味ではありません。
「オプションのパラメータ」という用語は混乱を招くようです。明確にするために、ここでの「オプション」という単語は単にパラメータ値の型を説明することを意味しているだけなので、「オプションのパラメータ」ではなく「オプションの型パラメータ」と言う方が正確です。
あなたはOptional
をデフォルト値と混同しています。 Optional
は、値またはnilを受け入れます。デフォルトを設定すると、関数を呼び出すときに引数を省略することができます。引数は、Optional
タイプであるかどうかにかかわらず、デフォルト値を持つことができます。
func someFunc(param1: String?,
param2: String = "default value",
param3: String? = "also has default value") {
print("param1 = \(param1)")
print("param2 = \(param2)")
print("param3 = \(param3)")
}
出力付きの呼び出し例:
someFunc(param1: nil, param2: "specific value", param3: "also specific value")
param1 = nil
param2 = specific value
param3 = Optional("also specific value")
someFunc(param1: "has a value")
param1 = Optional("has a value")
param2 = default value
param3 = Optional("also has default value")
someFunc(param1: nil, param3: nil)
param1 = nil
param2 = default value
param3 = nil
要約する:
Optional
はnilでもTypeのインスタンスを含んでもかまいませんOptional
とdefaultの両方がある場合、それは関数呼び出しから省略されるかもしれませんORは含まれるかもしれませんし、nil値(例えばparam1:nil)を与えられることができますブールパラメータを使用する必要がある場合は、デフォルト値を代入するだけです。
func test(WithFlag flag: Bool = false){.....}
それからあなたはパラメータなしで、またはパラメータと一緒に使用することができます:
test()
test(WithFlag: true)
パラメータを指定して、または指定せずにfunc
を呼び出せるようにするには、もう一方を呼び出す同じ名前の2番目のfunc
を作成します。
func test(firstThing: Int?) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
func test() {
test(firstThing: nil)
}
これでtest
という名前の関数をパラメータなしでもパラメータなしでも呼び出せるようになりました。
// both work
test()
test(firstThing: 5)