【Swift4】objective-cからSwiftのクラスを呼び出す。

おぶしーからすいふとに切り替えて暫く経ちますが、古いアプリなど丸っとスイフトに書き換えるのは面倒なので、
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クラスを使いたいので、適当にインポートしてみた。

#import "hagehage.swift"  //'hagehage.swift'file not found

エラーが出た。(´・ω・`)ショボーン

ネットで調べて、-Swift.hを着けたら良いのね!(`・ω・´)シャキーン

#import "hagehage-swift.h"  //'hagehage-swift.h'file not found

あれ?(´・ω・`)

#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

#import "hogehoge-Swift.h"

これでよかったようです。/(^o^)\
クラス呼び出すんやからクラス名だと思うやん…。(´・ω・`)

ちなみに呼ばれる側は

@objcMembers
class hagehage : NSObject {

のように@objcMembersをつけるか、メソッドの前に @objc をつけておくようです。

他にもハマりどころはありそうなので他サイトも参考に。
うじゃうじゃ。

2018/07/10追記
上記のようにswiftファイルをインポート出来るようになりました。
で、次の記事にあるSEManager.swiftで音を鳴らしたいのですが、
objective-cからSEManager.swiftのメソッドを呼び出そうとするとエラーが!!

[[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^)\

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です