web-dev-qa-db-ja.com

Swift Referencesの_アンダースコアの代表は何ですか?

Appleのドキュメントのリファレンスセクションには、この種のインスタンスが多数あります。

func runAction(_action: SKAction!)

これのObjective-Cの「同等」は次のとおりです。

- (void)runAction:(SKAction *)action

(Swift参照で)アンダースコアと「アクション」が斜体で書かれた後にスペースがあることがおそらく重要だと思います。

しかし、これが何を伝えようとしているのかわかりません。おそらく質問は...参照で使用されている規則の参照はありますか?

-これは、アンダースコアの使用に関するこのリファレンスで参照しているページです: https://developer.Apple.com/documentation/spritekit/sknode#//Apple_ref/occ/instm/SKNode/runAction

更新

Swift 3は、関数/メソッドのパラメーター名と引数ラベルの使用方法と名前付け方法にいくつかの変更を加えました。これは、この質問とその答えに影響を及ぼします。 @Ricksterは、これをクリアする関数の_underscoresに関する別の質問に答えるという素晴らしい仕事をしています。ここでは なぜアンダースコアが必要なのですか?

136
Confused

どちらの答えも正しかったが、もう少し明確にしたい。

_メソッドの外部パラメーター名の動作の変更 に使用されます。

ドキュメントの メソッドのローカルおよび外部パラメーター名 セクションでは、次のように記述されています。

Swiftは、デフォルトでmethodの最初のパラメーター名をローカルパラメーター名に、2番目以降のパラメーター名をデフォルトのローカルおよび外部パラメーター名の両方に指定します。

一方、デフォルトでは、関数には外部パラメーター名はありません。

たとえば、このfoo()メソッドはクラスBarで定義されています:

class Bar{
    func foo(s1: String, s2: String) -> String {
        return s1 + s2;
    }
}

foo()を呼び出すと、bar.foo("Hello", s2: "World")のように呼び出されます。

ただし、宣言されている_の前にs2を使用することにより、この動作をオーバーライドできます。

func foo(s1: String, _ s2: String) -> String{
    return s1 + s2;
}

次に、fooを呼び出すと、2番目のパラメーターの名前なしで、単にbar.foo("Hello", "World")のように呼び出すことができます。

ケースに戻りますが、runActionSKNode型に関連付けられているため、明らかにメソッドです。したがって、パラメータactionの前に_を置くと、外部名なしでrunActionを呼び出すことができます。

Swift 2.0の更新

関数とメソッドが機能するようになりました同じ方法ローカルおよび外部引数名の宣言に関して。

関数は、デフォルトで外部パラメーター名を使用して、2番目のパラメーターから呼び出されるようになりました。このルールは、純粋なSwiftコードにのみ適用されます。

そのため、functionの前に_を指定することにより、methodに対して行うように、呼び出し側は外部パラメーター名を指定する必要がなくなります。 =。

108
Aaron He

下線は、破棄された値を示すために使用される一般的なトークンです。

この特定のケースでは、関数はrunAction(argument)ではなくrunAction(action:argument)として呼び出されることを意味します

他のコンテキストでは、他の同様の意味があります。に:

for _ in 0..<5 { ... }

これは、ブロックを5回実行するだけで、ブロック内のインデックスを気にしないことを意味します。

このコンテキストでは:

let (result, _) = someFunctionThatReturnsATuple()

つまり、Tupleの2番目の要素が何であるかは気にせず、最初の要素だけを気にします。

85
David Berry

パラメーター宣言の前の識別子は、externalパラメーター名を定義します。これは、関数を呼び出すときに呼び出し元が提供する必要がある名前です。

func someFunction(externalParameterName localParameterName: Int)

Swiftは、自分で外部名を指定しない場合、定義したデフォルトのパラメーターに自動外部名を提供します。外部パラメーター名にアンダースコアを使用すると、この動作が無効になります。

パラメーターを定義するときに、明示的な外部名の代わりに下線(_)を記述することにより、この動作をオプトアウトできます。

この動作の詳細については、デフォルト値を持つパラメーターの外部名here のセクションを参照してください。

13
dasblinkenlight

Swift 3以降すべての引数ラベルはデフォルトで必要です。

IDEを強制して、_で引数ラベルを非表示にすることができます。

func foo(a: String) {
}

func foo2(_ a: String) {
}

foo(a: "abc")およびfoo2("abc")と呼ばれる

注:これは、a(external)引数labelおよび(内部)変数名同時に。それは同等です-func foo(a a: String)_を受け入れません。

なぜAppleがそれを使用するのですか?

AppleがAPI全体で使用していることがわかります。 Appleのライブラリは引き続きObjective-Cで書かれています(そうでない場合、Objective-C構文用に設計された同じ関数名を共有しています)

applicationWillResignActive(_ application: UIApplication)のような関数は、冗長パラメーター名applicationを持ちます。これは、既にapplicationが存在するためです関数名です。

あなたの例

func runAction(_ action: SKAction!)は、なしrunAction(action:)のような_マークと呼ばれます。パラメーター名actionは、関数名に既にあるため、redundantになります。それが目的であり、そこにある理由です。

11
Jakub Truhlář

これによりSwiftの規則が強制され、objective-cに近づき、ココアの規則によりよく一致するようになります。 objcでは、最初のパラメーターに(外部的に)名前を付けません。代わりに、慣例により、通常、次のようにメソッド名の後半に外部名を含めます。

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];

Swift api呼び出しをobjcと整合させるには、最初のparamの外部パラメーター名を非表示にする必要があります。

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")
10
smileBot

実際、メソッドの定義に使用される実際のコードとAppleのドキュメントのメソッド宣言には違いがあります。 IControl-addTarget:action:forControlEvents:メソッドを例にとってみましょう。実際のコードは次のとおりです。 enter image description here

しかし、ドキュメントでは、次のように表示されます(ターゲットの前の_に注意): enter image description here

実際のコードでは、_はメソッドの呼び出し時に2番目以降のパラメーターの外部名が表示されないようにするために使用されますが、ドキュメントでは、パラメーターのローカル名の前の_は、メソッドまたは関数を呼び出すときに、外部名を指定しないでください。

独自に提供するか、パラメーターのローカル名の前に(空白なしで)#を追加しない限り、既定で関数が呼び出されるとき、外部名はありません。たとえば、これはdispatch_after: enter image description here

そして、ドキュメントでは、次のように表示されます(注意3 _): enter image description here

関数の宣言の規則は、methodで説明したものとまったく同じです。

5
fujianjin6471

より視覚的に。

enter image description here

_を見るとわかるように、ローカルパラメータ名を省略してもしなくてもかまいません。

1
Nik Kov