通勤中のヒマ潰しにSwiftを勉強するよ!無料会員なので実行環境は無いのですが…
「あったらいいな」な機能がいっぱいあって楽しみです。
SwiftからCocoaのAPIってどう使うの?と思ったら、第1引数の直前までがメソッド名、それ以降が外部パラメータ名(いわゆるラベル)として扱われるんですね。ふーん。
でもー、Swiftの使命の一つに、Objective-Cアレルギーの皆さんをだまくらかすことがあるはずだと思うのでー、
hoge.addButtonWithTitle("ok")
よりも、
hoge.addButton(title:"ok”)
って書けた方がウケが良かったりしたんじゃないでしょうか。
口頭でメソッド名を伝えるにしても、リファレンスからお目当てのメソッドを探すにしても、従来の長々としたセレクタを詠唱したり暗記するのと、「動詞と目的語」だけで済むのとでは雲泥の差があると思います。
「イニシャライザの第1引数の外部パラメータ名はイニシャライザを区別するために必須だけど、通常のメソッドの第1引数の名前はメソッド名に含める」って規則も何か中途半端って言うかー。どっちかにしちゃえばイイじゃん。
「おっと待ちな坊主、じゃあ application: didFinishLaunchingWithOptions: のように動詞で始まらないメソッドはどうするんだ?メソッド名にできる部分が無いぜ…?」
そう、それなんですよ!今更ですけどCocoaのデリゲートメソッド名って、パラメータの数によって「主語: 時制動詞目的語パラメータ名:」と、「主語時制動詞目的語:」の形式があるのがスンゴいモヤモヤするー!!
application(app, didFinishLaunchingWithOptions:opt)
applicationDidFinishLaunching(ntf)
この2つをぱっと見で同じ仲間と認識するのは無理でんがな。メソッド名(括弧の前まで)の長さが違いすぎる!
さらに言うと、Objective-Cの命名規則はメソッド名から引数の型と用途が推測できるのがメリットとされています。この点は分かる…スゲーよく分かる。でも、applicationDidFinishLaunchingの中に、引数のNSNotificationの名前が出てこねーじゃあねえかァァ〜ッ!ナメやがって超イラつくぜぇ〜〜ッ!!メリットどこ行った。
も一つ言うと、「tableView(…」で始まるようなデリゲートメソッドがズラリと並ぶと、メソッド名において最もユニークな「動詞」部分が引数リストに埋没してしまい、お目当てのメソッドを探す上で視線移動の面で優しくないのではないでしょうか。IDEのプルダウンメニューを使えばイイじゃん、というのとはまた話は別で。
いっそのこと、「主語時制動詞目的語:」の形式に統一してしまって、メソッドの第1引数の外部パラメータ名も必須にして、
applicationDidFinishLaunching(application:app, options:opt)
applicationDidFinishLaunching(notification:ntf)
…のようにすればスッキリじゃん?!(元より長くなってるけど…)
などと思いましたが、このくらいの事はSwift開発陣も承知の上で、メソッド名に変更を加えると収拾がつかなくなって阿鼻叫喚の地獄絵図を引き起こすので従来のままとしているのかもしれませんね。でもイニシャライザは機械的にメソッド名を加工してるっぽいのになあ。
(追記)
よくよく考えたら、イニシャライザは自分自身を初期化するためのメソッドなので、メソッド名に「目的語」が必要ないんですね。そのため「With」等でキレイにパラメータ名だけ切り離す事ができる訳ですが、addSubview:のような「動詞目的語」形式で目的語が第1引数にかかっているようなメソッド名で外部パラメータ名を必須にしてしまうと、
addSubview(subview:subview)
add(subview:subview)
なんとも収まりが悪くなってしまいます。
長い長いと不評なCocoaのAPI名ですが、こうして見るとあんまり削れるところって無いような気がしてきました。後はBackgroundをBGにするとか、ApplicationをAppにするとか、2、3文字の略語や頭字語まみれにすれば少しはタイプ量が減るかもしれませんが、いまさらCの標準関数とかUnixのコマンド名みたいなメソッド名は時代錯誤よね〜。
結論:Cocoaのメソッド名が長いのは、あきらめよう!