例えば Swift でこの様なものを定義したとします:
SomeClass.swift
class SomeClass: NSObject {
var id: String?
func updateID(from dictionary: [String: String]) {
// self.id = ...
}
}
これらは Swift で呼び出す場合は someClass.id
や someClass.updateID(from: someDictionary)
で呼び出せるので何も困ることはないです。
ところが Obj-C がまだ混在しているプロジェクトの場合、これらはそのまま Obj-C で呼び出すと:
SomeSource.m
someClass.id;
[someClass updateIDFrom: someDictionary];
になります。
まあビルドするぶんには何も問題ないが、ちょっとした細かい問題点があります:
1. Obj-C では id
は AnyObject
のようなもので、Xcode では .id
は予約語のシンタックスハイライトになっているだけでなく、cmd 押しながらプロパティークリックしても定義とかに飛べないので気持ち悪い
2. Obj-C の API Design Guideline としては引数ラベルで引数名を入れるのが筋です
なので、気持ちとしては Obj-C で呼び出す時は下記のように呼び出したいかもしれない:
SomeSource.m
someClass.ID;
[someClass updateIDFromDictionary: someDictionary];
これはどうすればいいのかというと、@kishikawakatsumi 先生に教えられて、@objc([ALT_NAME])
のアトリビュートが付けられるそうです
というわけで、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 化進めてる皆さん、一緒に楽しく()頑張りましょうズイ₍₍(ง˘ω˘)ว⁾⁾ズイ