LoginSignup
11
6

More than 5 years have passed since last update.

【小ネタ】Swift で Objective-C 側用の API を指定する仕方

Last updated at Posted at 2017-11-22

例えば Swift でこの様なものを定義したとします:

SomeClass.swift
class SomeClass: NSObject {

    var id: String?

    func updateID(from dictionary: [String: String]) {
        // self.id = ...
    }

}

これらは Swift で呼び出す場合は someClass.idsomeClass.updateID(from: someDictionary) で呼び出せるので何も困ることはないです。

ところが Obj-C がまだ混在しているプロジェクトの場合、これらはそのまま Obj-C で呼び出すと:

SomeSource.m
someClass.id;
[someClass updateIDFrom: someDictionary];

になります。

まあビルドするぶんには何も問題ないが、ちょっとした細かい問題点があります:
1. Obj-C では idAnyObject のようなもので、Xcode では .id は予約語のシンタックスハイライトになっているだけでなく、cmd 押しながらプロパティークリックしても定義とかに飛べないので気持ち悪い
2. Obj-C の API Design Guideline としては引数ラベルで引数名を入れるのが筋です

なので、気持ちとしては Obj-C で呼び出す時は下記のように呼び出したいかもしれない:

SomeSource.m
someClass.ID;
[someClass updateIDFromDictionary: someDictionary];

これはどうすればいいのかというと、@kishikawakatsumi 先生に教えられて、@objc([ALT_NAME]) のアトリビュートが付けられるそうです
スクリーンショット 2017-11-22 17.46.06.png

というわけで、Swift で下記のように定義してみます:

SomeClass.swift
class SomeClass: NSObject {

    @objc(ID) var id: String?

    @objc(updateIDFromDictionary:) func updateID(from dictionary: [String: String]) {
        // self.id = ...
    }

}

これで、無事 Obj-C で下記のように呼び出せます:

SomeSource.m
someClass.ID;
[someClass updateIDFromDictionary: someDictionary];

それでは、まだ Obj-C 時代の負債と戦いながら Swift 化進めてる皆さん、一緒に楽しく()頑張りましょうズイ₍₍(ง˘ω˘)ว⁾⁾ズイ

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6