さまざまな使用例にはいくつかのニュアンスがありますが、一般的に下線は「これを無視する」ことを意味します。
新しい関数を宣言するとき、アンダースコアは、呼び出されたときにパラメーターにラベルを付けてはならないことをSwiftに通知します。より完全な関数宣言は次のようになります。
func myFunc(label name: Int) // call it like myFunc(label: 3)
「label」は引数ラベルであり、関数を呼び出すときに存在する必要があります。(そしてSwift 3以降、デフォルトではすべての引数にラベルが必要です。) "name"は関数内で使用するその引数の変数名です。短い形式は次のようになります。
func myFunc(name: Int) // call it like myFunc(name: 3)
これは、外部引数ラベルと内部パラメータ名の両方に同じ単語を使用できるようにするショートカットです。と同等func myFunc(name name: Int)
です。
パラメータラベルなしで関数を呼び出せる_
ようにする場合は、アンダースコアを使用して、ラベルを何も/無視しないようにします。(その場合、パラメーターを使用できるようにするには、内部名を指定する必要があります。)
func myFunc(_ name: Int) // call it like myFunc(3)
割り当てステートメントでは、下線は「何にも割り当てない」ことを意味します。結果を返すが戻り値を気にしない関数を呼び出したい場合に、これを使用できます。
_ = someFunction()
または、リンクした記事のように、返されたタプルの1つの要素を無視するには、次のようにします。
let (x, _) = someFunctionThatReturnsXandY()
定義済みの関数タイプを実装するクロージャーを作成する場合、下線を使用して特定のパラメーターを無視できます。
PHPhotoLibrary.performChanges( { /* some changes */ },
completionHandler: { success, _ in // don't care about error
if success { print("yay") }
})
同様に、プロトコルを採用する関数またはスーパークラスメソッドをオーバーライドする関数を宣言する場合_
、パラメーター名を使用してパラメーターを無視できます。プロトコル/スーパークラスでは、パラメータにラベルがないことも定義されている場合があるため、2つのアンダースコアが連続する場合もあります。
class MyView: NSView {
override func mouseDown(with _: NSEvent) {
// don't care about event, do same thing for every mouse down
}
override func draw(_ _: NSRect) {
// don't care about dirty rect, always redraw the whole view
}
}
最後の2つのスタイルにある程度関連しています。ローカル変数/定数をバインドするフロー制御構成を使用_
する場合、それを使用して無視できます。たとえば、メンバーへのアクセスを必要とせずにシーケンスを反復したい場合:
for _ in 1...20 { // or 0..<20
// do something 20 times
}
switchステートメントでタプルケースをバインドしている場合、この例のように、アンダースコアはワイルドカードとして機能します(The Swift Programming Languageの短縮形)。
switch somePoint { // somePoint is an (Int, Int) tuple
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
print("(0, \(somePoint.1)) is on the y-axis")
default:
print("(\(somePoint.0), \(somePoint.1)) isn't on an axis")
}
あまり関連性のない最後の1つは、(コメントで示されているように)ここから人々を導くように私が含めるためです:識別子のアンダースコア(たとえばvar _foo
、func do_the_thing()
)struct Stuff_
は、特にSwiftには何も意味しませんが、いくつかの用途がありますプログラマの間で。
名前内のアンダースコアはスタイルの選択ですが、Swiftコミュニティでは推奨されていません。Swiftコミュニティでは、タイプにUpperCamelCaseを使用し、他のすべてのシンボルにlowerCamelCaseを使用することについて強い規則があります。
下線付きのシンボル名の接頭辞または接尾辞はスタイルの規約であり、エクスポートされたAPIからプライベート/内部使用のみのシンボルを区別するために歴史的に使用されていました。ただし、Swiftにはそのためのアクセス修飾子があるため、この規則は一般にSwiftでは慣用的ではないと見なされています。
2つのアンダースコアプレフィックス(func __foo()
)が付いたいくつかのシンボルは、AppleのSDKの奥深くに潜んでいます。これらは、NS_REFINED_FOR_SWIFT
属性を使用してSwiftにインポートされた(Obj)Cシンボルです。Appleは、(Obj)C APIの「より迅速な」バージョンを作成したい場合に、たとえば、型に依存しないメソッドをジェネリックメソッドにしたい場合にそれを使用します。洗練されたSwiftバージョンを機能させるには、インポートされたAPIを使用する必要があるため、__
ほとんどのツールやドキュメントから非表示にしながら、を使用して利用できるようにします。