Swiftで書いたコードはObjective-Cでも使えるが・・・
Swiftで書いたクラスもNSObjectを継承させたり@objc
を使うことでObjective-Cでも使うことができますね。
しかしSwiftでの書き方とObjective-Cの書き方って微妙に違うので、ただSwiftのコードを使うだけだとなんとなくそいつだけ違和感を生じさせたりすることもあります。
例えば引数。
Objective-Cでは
[someObject getXXXWithId:xxxx];
みたいなメソッドが一般的だと思うですが、Swiftだと
someObject.get(xxx)
// あるいは
someObject.get(id:xxx)
みたいな感じに使うことが多い、というかそう使いたくなると思います。
swiftではスマートに書きたい・使いたいが、Objective-Cでは空気を読んでObjective-Cっぽく振舞って欲しい。そう願うあなたに一つの解決法を提案しましょう。
Swiftで書いたコードをObjective-Cでもスマートに使うには
func get(#id: Int) {
// 省略
}
func get(#name: String) {
// 省略
}
こんなメソッドをswiftで宣言してみてください。するとなんとObjective-Cでは
// func get(id: Int)
[someObject getWithId:1234];
// func get(name: String)
[someObject getWithName:@"あいうえ"];
という形で、オーバーロードも含めて非常にObjective-Cっぽく使うことができます!
ちなみに、これは引数のラベルを必須にする書き方になるのでswiftで使おうとするとちょっとだけもっさりした書き方にはなります^^;
// func get(id: Int)
someObject.get(id: 1234)
// func get(name: String)
someObject.get(name: "あいうえ")
それでも、Withが入らないだけそこそこSwiftっぽくはなりますね!
個人的にはオーバーロードを使ったクラスでもObjective-Cで使えるようになるのがすごく便利でした。何も考えず#無しでオーバーロードさせたクラスを@objc
してしまうと、メソッド名の重複で怒られてしまうことになります^^;
新規のプロジェクトなら別ですが、Swiftへの置き換えならObjective-Cと混ぜながら徐々に置き換えているプロジェクトも多いはず。この辺が障壁でSwiftらしい書き方にならない!とお嘆きの方ぜひとも試してみてください。