Shoken Startup Blog

KitchHike Founder/CTO

Swiftのfuncの引数に出てくるアンダースコアやシャープの意味について調べた

Swiftではfuncでメソッドを定義する。 funcの引数に出てくるアンダースコアやシャープはExternal Parameter Namesという。 これはメソッドの引数をラベル化する場合に使う。Rubyのキーワード引数と似ている。

Swiftでは第二引数以降はラベルを付けて呼び出す必要がある

func join(s1: String, s2: String, joiner: String) -> String {
    return s1 + joiner + s2
}
join("hello", "world", ":") // => コンパイルエラー

join("hello", s2: "world", joiner: ":") // => OK

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Functions.html

アンダースコア ( _ ) は、引数が自明でラベルが必要ない場合に使う

// s2の前に_を書くと、
func join(s1: String, _ s2: String, joiner: String = " ") -> String {
    return s1 + joiner + s2
}

join("hello", "world", joiner: ":") // s2はラベル無しでOK

明示的にラベルで指定して欲しい時は、ラベルとして変数の前に外部から参照する文字列を置く

func join(first s1: String, second s2: String, joiner joiner: String) -> String {
    return s1 + joiner + s2
}

join(first: "hello", second: "world", joiner: ":")

シャープ ( # )は上記の外部から見えるラベルと、内部で使うパラメータが同じ名前の場合に簡略化できる

func join(s1: String, #s2: String, #joiner: String) -> String {
    return s1 + joiner + s2
}

join("hello", s2: "world", joiner: ":")

Shorthand External Parameter Names in Swift - Qiita

イニシャライザではデフォルト値が無くてもラベルが必要

class Example {
  init( counter: Int) { }
}

var example = Example(counter: 0) //ラベル必須
class Example {
  init( _ counter: Int) { }
}

var example = Example(0) //アンダースコアがあるとラベルはいらない