2016-05-18 16 views
33

nilデフォルト値nilに設定すると、デフォルト値nilを使用しないと機能しません。この関数を呼び出すときにパラメータが欠落することがあります。スウィフト関数の省略可能なデフォルトパラメータ

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

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

あなたは 'FUNCテストを書くことができることを考えてみましょう(firstThingます。int = 4)':デフォルトの値を持つ非'Optional'パラメータ。 'Optional'型(型名の'? 'が展開される)は値型です。 「オプションのパラメータ」は、その型にかかわらず、関数呼び出し時に存在しても存在しなくてもよいパラメータの不幸な名前です。 – zneak

+0

このコードをテストするのにどのバージョンのSwiftを使用していますか?あなたのコードは正常に動作します!オプションは単なる型であり、既定のパラメータはSwiftの別の型と同じように正常に動作します –

答えて

53

オプションとデフォルトのパラメータは、2つの異なるものです。

任意はnilの変数です。場合でも、あなたはオプションであり、パラメータを指定した場合、あなたはそれを提供する必要がfunc test(param: Int = 0)

:あなたはそのパラメータを省略する場合

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

また、func test(param: Int? = nil)のように、nilがデフォルト値であるオプションのパラメータを持つこともできます。

+2

"オプションのパラメータを指定する場合は、それを指定する必要があります"。すばらしい、ありがとうSwift – andrewtweber

11

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

test() 

が...これとまったく同じである:

あなたは、このようなデフォルト引数を省略した場合
test(nil) 

...

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

...そしてあなたは、もはやこれを行うことができます...

test() 

の場合あなたは、あなたが記述した "不足している議論"エラーを取得します。

test(nil) // this works 
8

スウィフトは、あなたがパラメータを渡すことなく、関数を呼び出すことができますし、それがまだ呼び出されるJavaScriptの、のような言語のようではありません:あなたは、その引数がちょうどnil場合でも、毎回の引数を渡す必要があります。したがって、Swiftで関数を呼び出すには、にはが必要です。パラメータに値を割り当てる必要があります。

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

デフォルト値を指定しない場合は、コールの値をtest(nil)に設定する必要があります。

また、この質問に直接関係はありませんが、Swiftの可能性のあるnilオプションを扱うために、nullポインタを扱う "C++"の方法を使用しています。次のコードは、(特別にソフトウェアをマルチスレッドで)より安全であり、それはあなたが強制オプションのアンラップを避けることができます:

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

あなたはそのパラメータの省略可能なパラメータとデフォルト値を結合しようとすると、それは少しトリッキーです。このように、

func test(param: Int? = nil) 

これらの2つのアイデアは完全に反対です。オプションの型パラメーターがありますが、既定値も提供している場合、デフォルト値を持つので、省略可能な型はもうありません。デフォルトがnilであっても、swiftは省略時の値をチェックせずにオプションのバインディングを削除するだけです。

だから、デフォルト値としてnilを使用しないように、常により良いです。

0

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

用語「オプションのパラメータは」混乱を招くように見えます。明確にするために、「オプションのパラメータ」ではなく「オプションのタイプのパラメータ」と言うのは、ここでは「オプション」という語がパラメータ値のタイプのみを記述することを意味し、それ以外は何も言いません。

関連する問題