Swift の第一引数がある関数を Objective-C で呼び出すときの注意
iOS Swift Objective-C
Published: 2018-12-09

目的

Swift で第一引数がある関数を定義して、 Objective-C で呼び出すとき何度か嵌ったのでメモしておきます。

嵌った例

Swift の関数

@objcMembers class Calc: NSObject {
    static func add(a:Int, b:Int) -> Int {
        return a + b
    }
}

Objective-C 側

[Calc add:2 b:3];

下記のようなエラーが発生しました。

No visible @interface for 'Calc' declares the selector 'add:b:'

解決した方法

Swift の関数の第一引数にラベルをつけない指定をしました。

Objective-C の場合は第一引数にラベルをつけないため、_ を指定する必要があります。

@objcMembers class Calc: NSObject
    static func add(_ a:Int, b:Int) -> Int {
        return a + b
    }
}

Objective-C 側は変えずに下記で呼び出せます

[Calc add:2 b:3];

@objcMembers について

class の前の @objcMembers は、 Swift のコードを Objective-C のコードを呼び出すために必要です。

参考