woshidan's loose leaf

ぼんやり勉強しています

`NS_SWIFT_NAME` マクロでObjective-CのコードがSwiftからどう見えるか規定できる

Objective-Cで書いたメソッドのシグネチャはSwiftから呼び出す時にメソッド名の一部の単語がパラメータ名の一部へ変換されるものがある。

// Objective-C
- (void)addToBox:(Item *)item;
// Swift 2.3
addToBox(item)

// Swift 3.0
add(toBox: item)

この変換具合がSwift2系と3系で結構違う上に前置詞などを使った動詞の塊が切り取られて引数のラベルみたいに扱われてしまう。

すると、主に一番最初の引数の意味が違って見えることがある。たとえば、 上記の例の Swfit 3.0 のシグネチャでは toBox というラベルがついてしまっているが、第一引数はItemのインスタンスであってBoxのインスタンスではないが、そういう風に見える。

なので、Objective-C + 複数のSwiftのバージョンに対応する必要がある場合はドキュメントなどのサンプルコードをどう書くか悩ましかったりする。

こういう場合、 NS_SWIFT_NAME を使って Swift ではこういうシグネチャで表示してほしい、という個別設定が可能。

- (void)addToBox:(Item *)item;
NS_SWIFT_NAME(addToBox(item:));

参考

qiita.com