おぶしーからすいふとに切り替えて暫く経ちますが、古いアプリなど丸っとスイフトに書き換えるのは面倒なので、
objective-cはそのままで、新規クラスはSwiftでと混在させてます。
んで、objective-cからSwiftのクラスを呼び出す時にちょっと詰まったんで備忘録。
参考サイト
Objective-CコードからSwiftのクラス/プロトコルを使う方法(フレームワーク開発編)
Objective-CベースのプロジェクトからSwiftのクラスを呼び出す
SwiftとObjective-Cの相互利用する際の注意
例えば、
hogehogeというアプリがあって、
higehige.h higehige.m というobjective-cのクラスが有って、
hagehage.swift というswiftのクラスがあるとする。
higehige.m で hagehage.swiftクラスを使いたいので、適当にインポートしてみた。
1 |
#import "hagehage.swift" //'hagehage.swift'file not found |
エラーが出た。(´・ω・`)ショボーン
ネットで調べて、-Swift.hを着けたら良いのね!(`・ω・´)シャキーン
1 |
#import "hagehage-swift.h" //'hagehage-swift.h'file not found |
あれ?(´・ω・`)
1 2 3 4 5 6 |
#import "hagehage.swift" //'hagehage.swift'file not found #import "hagehage-swift.h" //'hagehage-swift.h'file not found #import "hagehage-Swift.h" //'hagehage-Swift.h'file not found #import "<hagehage>-Swift.h" //'<hagehage>-Swift.h'file not found #import <hagehage-swift.h> //'hagehage-swift.h'file not found #import <hagehage-Swift.h> //'hagehage-Swift.h'file not found |
ムキー!なんで通らんのや!/(^o^)\
じっくり調べなおすと、、、「プロダクト名」-Swift.h なのか…。orz
1 |
#import "hogehoge-Swift.h" |
これでよかったようです。/(^o^)\
クラス呼び出すんやからクラス名だと思うやん…。(´・ω・`)
ちなみに呼ばれる側は
1 2 |
@objcMembers class hagehage : NSObject { |
のように@objcMembersをつけるか、メソッドの前に @objc をつけておくようです。
他にもハマりどころはありそうなので他サイトも参考に。
うじゃうじゃ。
2018/07/10追記
上記のようにswiftファイルをインポート出来るようになりました。
で、次の記事にあるSEManager.swiftで音を鳴らしたいのですが、
objective-cからSEManager.swiftのメソッドを呼び出そうとするとエラーが!!
1 |
[[SEManager sharedInstance]playSoundWithSoundName:@"hit.mp3"]; // No visible @interface for 'SEManager' declares the selector 'playSoundWithSoundName' |
SEManager.swiftのplaySoundメソッドは引数があるのでobjective-c側からはplaySoundWithSoundNameで呼び出します。
xcodeの変換サポートでも候補に出るし、問題なく認識していそうなのですが、どーやってもNo visibleのままです。
よくわからないまま試行錯誤を繰り返すこと丸一日、SEManager.swiftのplaySoundメソッドの中にある’throws’を消すと認識されました。
throws,do,try,catchというのはよく分かってないですがAVAudioPlayerを使う時にXcodeからつけろーと言われます。
このthrowsを消すと、別のswiftファイルからplaySoundメソッドを呼び出す所で黄色三角のエラーが出ますがビルドは出来ます。
なんとも明確な解決策が見いだせませんでしたが、とりあえず動いたので良しとしつつ、自分の無能を呪っときましょう。/(^o^)\