ObjCで作成されたライブラリのプライベートメソッドをSwiftから呼び出す

作りが悪いんだけどライブラリ化されているとどうしようもない




privateメソッドをpeformSelectorで呼び出す



以下のようなライブラリが提供されているとします。
LibClass.h
1
2
3
4
5
6
@interface LibClass : NSObject
 
- (NSString*)getVersion;
// - (NSString*)getMinorVersion; これが隠されている
 
@end

マイナーバージョンを取得するのにLibClass.aファイル内のprivateメソッドにアクセスしたい

1
2
let lib = LibClass()
let minorVersion = lib.performSelector("getMinorVersion")

一応以上でprivateメソッドへアクセスできますが、Swift2.2以降だと警告が出てきます。



Swift2.2以降でpeformSelectorの警告が出ないようにする



LibClass.h
1
2
3
4
5
6
@interface LibClass : NSObject
 
- (NSString*)getVersion;
- (NSString*)getMinorVersion;
 
@end


呼び出し
1
2
let lib = LibClass()
let minorVersion = lib.performSelector(#selector(LibClass.getLibraryVersion))

これで警告がなくなる訳ですが、これってひょっとして...




ヘッダファイルに追記するだけでよかった



実はperformSelectorを使用せずともヘッダファイルに関数宣言するだけで使用できるようになります。
ただしメソッド名、引数と戻り値は一致させる必要が有ります。



1
2
let lib = LibClass()
let minorVersion = lib.getLibraryVersion()



2016年10月7日金曜日