LoginSignup
18
18

More than 5 years have passed since last update.

Swiftで作ったメソッドをObjective-Cで使うときの小ネタ

Last updated at Posted at 2014-11-25

Swiftで書いたコードはObjective-Cでも使えるが・・・

Swiftで書いたクラスもNSObjectを継承させたり@objcを使うことでObjective-Cでも使うことができますね。

しかしSwiftでの書き方とObjective-Cの書き方って微妙に違うので、ただSwiftのコードを使うだけだとなんとなくそいつだけ違和感を生じさせたりすることもあります。

例えば引数。
Objective-Cでは

objective-C
[someObject getXXXWithId:xxxx];

みたいなメソッドが一般的だと思うですが、Swiftだと

swift
someObject.get(xxx)
// あるいは
someObject.get(id:xxx)

みたいな感じに使うことが多い、というかそう使いたくなると思います。

swiftではスマートに書きたい・使いたいが、Objective-Cでは空気を読んでObjective-Cっぽく振舞って欲しい。そう願うあなたに一つの解決法を提案しましょう。

Swiftで書いたコードをObjective-Cでもスマートに使うには

swift
func get(#id: Int) {
    // 省略
}

func get(#name: String) {
    // 省略
}

こんなメソッドをswiftで宣言してみてください。するとなんとObjective-Cでは

objective-C
// func get(id: Int)
[someObject getWithId:1234];
// func get(name: String)
[someObject getWithName:@"あいうえ"];

という形で、オーバーロードも含めて非常にObjective-Cっぽく使うことができます!
ちなみに、これは引数のラベルを必須にする書き方になるのでswiftで使おうとするとちょっとだけもっさりした書き方にはなります^^;

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らしい書き方にならない!とお嘆きの方ぜひとも試してみてください。

18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18