web-dev-qa-db-ja.com

Swift関数のデフォルトのオプションパラメータ

firstThingをデフォルトのnilに設定すると、これは機能しますが、デフォルト値のnilがなくても、関数を呼び出すときにパラメーターがないというエラーが表示されます。

Int?と入力することで、デフォルト値のnilでオプションにしたと思いますが、正しいですか?もしそうなら、なぜ= nilがなければうまくいかないのでしょうか。

func test(firstThing: Int? = nil) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
test()
73
RickBrunstedt

オプションとデフォルトパラメータは、2つの異なる点があります。

Optionalはnilになることができる変数です、それだけです。

デフォルトのパラメーターは、そのパラメーターを省略するとデフォルトの値を使用します。このデフォルト値は、次のように指定されます。func test(param: Int = 0)

オプションのパラメータを指定した場合は、渡したい値がnilであっても指定する必要があります。あなたの関数がこのfunc test(param: Int?)のように見えるならば、あなたはこのtest()のようにそれを呼ぶことができません。パラメータはオプションですが、デフォルト値はありません。

この2つを組み合わせて、nilがデフォルト値のfunc test(param: Int? = nil)のように、省略可能なパラメーターを使用することもできます。

136
EmilioPelaez

デフォルトの引数を使用すると、引数を渡さずに関数を呼び出すことができます。引数を渡さないと、デフォルトの引数が与えられます。だから、あなたのコードを使用して、これ...

test()

...これはまったく同じです。

test(nil)

このようにデフォルトの引数を省略すると...

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

...それからあなたはもうこれを行うことはできません...

test()

そうした場合、あなたはあなたが説明した "missing argument"エラーを受け取るでしょう。たとえその引数が単なるnilであっても、毎回引数を渡さなければなりません:

test(nil)   // this works
17
Aaron Rasmussen

SwiftはJavaScriptのような言語には似ていません。そこでは、パラメータを渡さずに関数を呼び出すことができ、それでも呼び出されます。そのため、Swiftで関数を呼び出すには、そのパラメータに値を代入するために必要を使用します。

パラメータのデフォルト値を使用すると、関数を呼び出すときに値を指定せずに値を割り当てることができます。テストの宣言でデフォルト値を指定したときにtest()が機能するのはそのためです。

そのデフォルト値を含めない場合は、呼び出し時に値を提供する必要があります:test(nil)

また、この質問に直接関連するわけではありませんが、おそらく注意する価値がありますが、Swiftで可能性のあるnilオプションを処理するために、nullポインタを処理する「C++」方法を使用しています。次のコードはより安全で(特にマルチスレッドソフトウェアで)、オプションの強制的な展開を避けることができます。

func test(firstThing: Int? = nil) {
    if let firstThing = firstThing {
        print(firstThing)
    }
    print("done")
}
test()
16
nbloqs

「オプションパラメータ」は「このパラメータの種類はオプションです」という意味です。 「このパラメータはオプションなので、この関数を呼び出すときに無視することができます」という意味ではありません。

「オプションのパラメータ」という用語は混乱を招くようです。明確にするために、ここでの「オプション」という単語は単にパラメータ値の型を説明することを意味しているだけなので、「オプションのパラメータ」ではなく「オプションの型パラメータ」と言う方が正確です。

1
Todanley

あなたは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

要約する:

  • とタイプ? (Stringなど)はOptionalはnilでもTypeのインスタンスを含んでもかまいません
  • デフォルト値を持つ引数はfunctionの呼び出しから省略されてもよく、デフォルト値が使用されます
  • Optionalとdefaultの両方がある場合、それは関数呼び出しから省略されるかもしれませんORは含まれるかもしれませんし、nil値(例えばparam1:nil)を与えられることができます
1

ブールパラメータを使用する必要がある場合は、デフォルト値を代入するだけです。

func test(WithFlag flag: Bool = false){.....}

それからあなたはパラメータなしで、またはパラメータと一緒に使用することができます:

test()
test(WithFlag: true)
0
Niib Fouda

パラメータを指定して、または指定せずに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)
0
Sean256