[Swift4] Objective-Cからクラスを利用する

Objective-C
スポンサーリンク
こんにちは。 雑食会社員🐼くま子です
スポンサーリンク

問題

class Hoge: NSObject {
    func piyo () {
        print("test")
    }
}
  • 下記リンク先の方法を用いて
    Swiftで書かれたクラスの関数をObjective-Cから利用しようとしたものの、
    関数呼び出しの部分で下記のエラーが出てしまう。
SwiftとObjective-Cの相互利用する際の注意 - Qiita
とりあえずObjCとswiftを相互利用する時にいくつかハマったので書きたいと思います。ちゃんとここ読んでいればわかることなんですが…

No known class method for selector ‘関数名’

  • クラスの生成自体はエラーにならない。

  • <プロジェクト名>-Swift.hをみると、関数名が定義されていない。

SWIFT_CLASS("*****")
@interface Hoge : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

環境

  • XCode 9.2
  • Swift4

原因

Swift4から、Objective-Cからクラスを利用する際の記述方法が変わった

  • 参考
[iOS 11] Swift 4は前バージョンから何が変わったか比較した | DevelopersIO

解決策

Swiftでのクラス定義を、下記いずれかの方法で記述する。
そうすれば、ちゃんと.hファイルにも定義が追加される。

特定の関数のみ利用する場合

class Hoge: NSObject {
    @objc func piyo () {
        print("test")
    }
}

クラスの関数全体を利用する場合

@objcMembers
class Hoge: NSObject {
    func piyo () {
        print("test")
    }
}

コメント