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


144

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に関する別の質問に答えるというすばらしい仕事をします


3
[underscore.js]でタグ付けされた??
マーティンR

3
ドキュメントは、変数名にイタリックを使用する数学的規則に従っています。たとえば、次のようにsin² A +cos² A = 1
ロブmayoff

回答:


116

どちらも正解でしたが、もう少し明確にしたいと思います。

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

ではメソッドのローカルおよび外部パラメータ名の文書の部分、それは言います:

Swiftは、メソッドの最初のパラメーター名にデフォルトでローカルパラメーター名を与え、2番目以降のパラメーター名にデフォルトでローカルパラメーター名と外部パラメーター名の両方を与えます。

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

たとえば、このfoo()メソッドはclassで定義されてい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;
}

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

あなたのケースに戻ると、明らかにrunActiontype SKNodeに関連付けられているため、メソッドです。したがって、_beforeパラメータを指定actionするとrunAction、外部名なしで呼び出すことができます。

Swift 2.0のアップデート

関数とメソッドは、ローカルおよび外部の引数名宣言に関して同じように機能します。

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

したがって、関数の_前にを提供することにより、呼び出し側は、メソッドに対して行うのと同じように、外部パラメーター名を指定する必要がなくなります。


9
混乱し_ます。2番目のパラメーターの前に書き込む場合、あなたの答えは明らかに十分です。何であればfunc runAction(_action: SKAction!)_最初のパラメータの前にあるか、あなたは以下のコードを記述する場合は func foo(_ s1: String) { // your code }Xcodeはあなたに警告を与えるだろうが、多くのコードは次のようにありますfunc bringSubviewToFront(_ view: UIView)参照、なぜに?
チャンは

10
だから、基本的に、それは理由もなくこれを行い、ただ混乱させるだけです。驚くばかり。
ボットボット2014

2
アンダースコアは、「ワイルドカードパターン」として知られているdeveloper.apple.com/library/ios/documentation/Swift/Conceptual/...
user2143356

文書によると、@ Wyatt Zhang _は、最初のパラメーターのの使用は無関係です。私は仮定を立てることができます。デザイナーはそれが明らかにあなたのコードにとって十分であり、可読性を強化しないと思い、かなり逆にコードを汚します。したがって、警告が表示されます。参照には反対の目的があります。できる限り明確にする必要があるため、最初のパラメーターの下線はすべてのメソッドで言及されています。それはすべてを説明するでしょう)
ドミトリー・グリアジン

4
Swift 3.0は状況を変えることに注意することが重要です。特に指定しない限り、すべてのラベルが必要です。したがって、-前の最初のパラメータはもはや無関係ではありません。例:override func viewWillAppear(_ animated: Bool)呼び出し元(Objective-Cコード)がパラメーターラベルを使用しないことを
Mr. T

85

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

この特定のケースでは、関数は次のように呼び出されrunAction(argument)ますrunAction(action:argument)

他の文脈では、それは他の同様の意味を持っています、例えば:

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

つまり、ブロックを5回実行するだけで、ブロック内のインデックスは関係ありません。

この文脈では:

let (result, _) = someFunctionThatReturnsATuple()

つまり、タプルの2番目の要素が何であるかは問題ではなく、最初の要素のみです。


この場合、引数(アクション)はオプションですか?
混乱

1
いいえ、この場合、外部パラメーター名(action :)は空になるため、省略されます。引数はまだ必要ですが、action:でタグ付けされていないだけです。
David Berry

4
本当の答えは@dasblinkenlightの答えと私の答えの組み合わせです。彼はこの特定のケースをより正確に扱いますが、私はより広い質問に取り組みますが、_はどういう意味ですか
David Berry

4
非常に大きな数字にも破棄記号を使用して、このように読みやすくすることができますlet pi = 3.141_592_653_59
SMP

面白いことに、これを使用して、非常に大きな数値を読みにくくすることもできます。たとえば、let pi = 3.1_4_15_92___63
David Berry

15

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

でIDEに引数ラベルを強制的に非表示にできます_

func foo(a: String) {
}

func foo2(_ a: String) {
}

呼び出されfoo(a: "abc")foo2("abc")

注:これaは、が(外部)引数ラベル(内部)変数名を同時に指定している場合にのみ使用できます。それは同等です- func foo(a a: String)を受け入れません_

なぜAppleはそれを使っているのですか?

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

などの関数は、関数名にすでにアプリケーションがあるため、冗長なパラメーター名applicationWillResignActive(_ application: UIApplication)を持ちますapplication

あなたの例

func runAction(_ action: SKAction!)のようなマークなしで呼び出されます。関数名にすでに1つあるため、パラメーター名は冗長になります。それが目的であり、そこにある理由です。_runAction(action:)action


13

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

func someFunction(externalParameterName localParameterName: Int)

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

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

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


だから...私の薄弱さがこの権利を持っているかどうか見てみましょう。この例では、パラメーター変数/定数に「action」という名前を付け、この関数で実行するSKActionに割り当てます。Swiftは、必要なデフォルトパラメーターに「action」という名前を自動的に付けます。しかし、このアクションにカスタム名を付けたい場合、関数の呼び出しでアンダースコアを使用する必要がありますか?
混乱

4
@混乱私の理解は、「アクション」はすでに関数名の一部であるため、SKデザイナーはaction2度書くことを望まないということです。言い換えれば、彼らはあなたに書いてほしくないのですsprite.runAction(action:moveGroundSpritesForever)。外部パラメーター名の目的は、コードを「文のように読み取る」ことです。action2回使用すると、その目的が無効になります。
dasblinkenlight 2014年

暗闇の中でいくつかのライトが点灯しました。理解できたと思います。言語のこの機能は、Swiftでの呼び出し関数を、Objective-Cでパラメーターを使用してメソッドを呼び出す方法とよく似たものにすることを目的としています。多分。
混乱

1
ただし、下線を使用して、デフォルト値で定義されたパラメーターのこれらの外部パラメーター名をどうにかしてオプトアウトすることができます...まだどのように行われるかはまだわかりません。探し続けます。
混乱

あなたは簡単にトグル間のことができるようにだから... ...要するに、それは単に、名前付きパラメータと序数のパラメータを切り替える foo.bar(param: 'fiddle')foo.bar('fiddle') ...しかし複数の引数と、それは非常に関連なった唯一の引数で、それは本当に明白になっていない:NOTE foo.bar(param1: 'fiddle', param2: 'dee')foo.bar('fiddle','dee')
jrypkahauer 2017年

10

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

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

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

Swift api呼び出しをobjcと一致させるには、最初のパラメーターの外部パラメーター名を抑制します。

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

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

2
この説明が好きです。最初にObj-Cを学んだので、物事を片付けました。また、Swiftでメソッドに適切に名前を付けることの重要性も強調されています。つまり、メソッド名の後半では、Obj-Cの場合と同様に、最初の引数を説明する必要があります。いい物。
rrrrrraul

5

実際、メソッドを定義するために使用される実際のコードとAppleのドキュメントのメソッド宣言との間には違いがあります。レッツ・テイクするuicontrolさん - addTarget:アクション:forControlEvents:例えば方法は、実際のコードは次のようになります。 ここに画像の説明を入力してください

しかし、ドキュメントでは、次のように表示されます(ターゲットの前の_に注意): ここに画像の説明を入力してください

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

独自に指定するか、パラメータのローカル名の前に(空白なしで)#を追加しない限り、関数がデフォルトで呼び出されるときに外部名はありません。たとえば、次のようにdispatch_afterを使用ます。 ここに画像の説明を入力してください

そして、ドキュメントでは、次のように表示されます(3つの_に注意): ここに画像の説明を入力してください

関数の宣言の規則は、メソッドについて説明したのとまったく同じです。


1

もっと視覚的に。

ここに画像の説明を入力してください

ご覧のとおり_、ローカルパラメータ名を省略するかどうかだけを確認してください。

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