[Swift 3.0] 関数ラベルのルールが変更になった話

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今回はSwift3.0の変更点の中で個人的に修正箇所が多そうだなと思っている SE-0046 Establish consistent label behavior across all parameters including first labels (一貫性のあるラベルをつけよう) の話です。 とはいえ、修正内容はシンプルなので、そんなに問題は出ないのではないでしょうか。(多分...)

どういった変更?

Swift2.x までは、関数の最初の引数名は呼び出し側では省略されてました。
Swift3.0からは、引数のパラメーターは位置に関係なく同一の挙動となります。それにより最初の引数名が省略されなくなりました。

どう修正すれば良い?

呼び出す時に最初の引数にもラベルを付けます。

Swift2.x(今までの例)
func card(rank: Int, suit: Character) { ... }

card(1, suit: "♠")
Swift3.0
func card(rank: Int, suit: Character) { ... }

card(rank:1, suit: "♠")

移行の際に影響を少なくする方法

最初の引数のラベルに_を付け、明示的に最初の引数のラベルを省略するようにします。
これにより、呼び出し側には影響がありません。

Swift3.0
func card(_ rank: Int, suit: Character) { ... }

card(1, suit: "♠")

理想

今までの関数の名前を付ける時にXXXXXWith△△のような名称を付けて、 △△の部分(関数名の最後の文字)が最初の引数を表すような感じで名前を付けていた事もあるかもしれません。

Swift2.x(今までの例)
func tintWithColor(color: UIColor) { ... }

tintWithColor(UIColor.red)

Swift3.0からは最初の引数にもラベルが付くので、XXXXXWith△△のような場合、With△△の部分が不要になります。

Swift3.0
func tint(color: UIColor) { ... }

tint(color: UIColor.red)

さいごに

個人的にはWithを名前に付けていたような関数名がすっきりするので良いと思いました。

WWDC2016でも、
Simpler and more consistent
API naming often encourages first parameter label
Any parameter label may be suppressed with _
What's New in Swift | WWDC2016 とありました。

Swift3.0変更点シリーズ?としては他にも、

があります。?

参考