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


107

firstThingデフォルトに設定するnilと、これは機能します。デフォルト値がnilなければ、関数を呼び出すときにパラメーターが欠落しているというエラーが発生します。

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

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

1
次のように書けることを考慮してくださいfunc test(firstThing: Int = 4)Optionalデフォルト値を持つ非パラメーター。Optional(何種類?タイプ名に展開)が値型です。「オプションのパラメーター」は、そのタイプに関係なく、関数呼び出しに存在する場合と存在しない場合があるパラメーターの残念な名前です。
zneak 2016年

このコードをテストするために使用しているSwiftのバージョンは何ですか?あなたのコードはうまくいきます!! オプションは単なるタイプであり、デフォルトのパラメーターはSwiftの別のタイプと同じようにうまく機能します
Victor Sigler

回答:


210

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

Optionalは、である可能性のある変数ですnil。それだけです。

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

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

この2つを組み合わせてnil、次のように、デフォルト値がオプションであるパラメータを使用することもできますfunc test(param: Int? = nil)


27
「オプションのパラメーターを指定する場合は、それを指定する必要があります」。グレート、ありがとうスウィフト
andrewtweber 2017年

8
@andrewtweberあなたのユーモアは高く評価されていますが、初心者にとっては、「オプション」がオブジェクトまたは値を提供することを指すことを明確にすると役立つと思いました。その必要はありません。代わりにnil(オブジェクトまたは値がないことを表す)を指定できます。選択するオプションを決定するだけです。
JD Sandifer 2018

23

デフォルトの引数を使用すると、引数を渡さずに関数を呼び出すことができます。引数を渡さない場合、デフォルトの引数が提供されます。コードを使用して、これは...

test()

...これとまったく同じです:

test(nil)

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

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

...その後、これを行うことはできません...

test()

その場合、説明した「引数がありません」エラーが発生します。引数が単にnil次の場合でも、毎回引数を渡す必要があります。

test(nil)   // this works

18

SwiftはJavaScriptのような言語とは異なり、パラメーターを渡さずに関数を呼び出すことができ、それでも呼び出されます。したがって、Swiftで関数を呼び出すには、そのパラメーターに値を割り当てる必要があります。

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

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

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

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

7

あなたは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?)はOptionalnilであるか、Typeのインスタンスを含むことができます
  • 関数の呼び出しからデフォルト値の引数を省略でき、デフォルト値が使用されます
  • 両方Optionalにデフォルトがある場合、関数呼び出しから省略できますORを含めることができ、nil値を指定できます(たとえば、param1:nil)

letやvarなどの変数としてデフォルトのパラメーターを追加できますか?ありがとう
Yogesh Patel

@YogeshPatelどういう意味かわかりません。
Chuck Krutsinger

var myName = "Yogesh"のように。今、私の関数は1のようになっています。func getFilterNames(name:string = myName){}このアプローチは私には機能しません。2. func getFilterNames(name:string = "Yogesh"){}このアプローチは私にとってはうまくいきます。しかし、私は最初のものが欲しいので、これを達成するのを手伝ってください。どうもありがとう!
Yogesh Patel

@YogeshPatel私は、あなたが望むかもしれないものだと思いfunc getFilterNames(name: inout String){ }ますが、渡された名前を変更することができます。
チャックKrutsinger

いやいやいや パラメータを変更したくありません。パラメータにデフォルト値を指定したいだけですが、静的な「Yogesh」は好きではありません。let name = "Yogesh" dynamic func getFilterNames(name:string = name)のようにしたいです。このサーを取得しますか?ありがとう!
Yogesh Patel

3

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

「オプションのパラメーター」という用語は混乱を招くようです。明確にするために、ここで「オプション」という言葉はパラメータ値のタイプを説明することだけを意図しており、他には何もないので、「オプションパラメータ」の代わりに「オプションタイプパラメータ」と言う方がより正確です。


3

boolパラメータを使用する必要がある場合は、デフォルト値を割り当てるだけです。

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

次に、paramなしで、またはparamで使用できます。

test() //here flag automatically has the default value: false
test(WithFlag: true) //here flag has the value: true

これに反対票を投じた人は、間違ったものを修正することができます。
Niib Fouda 2018

0

funcパラメータを付けて、または付けずにを呼び出すことができるようにする場合funcは、もう1つを呼び出す同じ名前の2番目を作成できます。

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

func test() {
    test(firstThing: nil)
}

これでtest、パラメーターなしまたはパラメーターなしの名前の関数を呼び出すことができます。

// both work
test()
test(firstThing: 5)

パラメータのデフォルト値としてnilだけを指定できるのに、なぜ追加の関数を定義するのですか?
Peter Schorn

-1

オプションのパラメーターとそのパラメーターのデフォルト値を組み合わせる場合、少し注意が必要です。このような、

func test(param: Int? = nil)

これら2つは完全に反対の考えです。オプションのtypeパラメータがあり、それにデフォルト値も提供する場合、デフォルト値があるため、オプションタイプではなくなりました。デフォルトがnilの場合でも、swiftはデフォルト値が何であるかを確認せずにオプションのバインディングを単に削除します。

したがって、デフォルト値としてnilを使用しない方が常に良いでしょう。


1
これは誤りです。オプションがデフォルト値を持つことで何も問題はありません(でもnil)。
ブライアンケンディグ2018年

私が言っているのは、変数にデフォルト値があると、常に値を持つという意味でオプションではありません。
Shubham Naik

1
それは真実ではなく、あなたが何を説明しようとしているのかわかりません。変数に値が割り当てられると、常に割り当てられると正しく言っていると思います。割り当てを解除しない限り、割り当てを解除することはできません。また、Swiftは、値を取得する前に(のようにvar foo: String; print(foo))変数を使用しようとすると、コンパイルエラーになります。ただし、デフォルト値を持つ関数引数はオプションの引数であり(関数呼び出しで渡す必要はありません)、オプションタイプにすることもできます(nilデフォルト値としても割り当てることができます)。
ブライアンケンディグ2018年

Optionalは本質的に<Type |の共用体タイプです。Nil>。つまり、SpecifiedタイプまたはNilタイプを使用できます。(SwiftにはUnionsがあったと仮定しましたが、そうではありませんが、ここでは概念的に話しています)。だからInt?= nilは完全に問題ありません。
Shayne

-1

デフォルト値は、データ型のデフォルト値を意味しません。ここでのデフォルト値は、関数を定義するときに定義された値を意味します。関数で変数を定義するときに、変数のデフォルト値を宣言する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.