[Swift4] 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
Developers.IOは、AWS、iOS/Androidアプリ、ビッグデータ、Alexa等の最新技術情報からリモートワークや働き方に関する記事まで多彩なトピックを紹介するクラスメソッドのオウンドメディアです。

解決策

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

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

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

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

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