概要
NSDictionary の objectForKey を Delphi から呼ぶ方法です。
なぜ解説が必要なのか
NSDictionary の objectForKey がポインタ(ID型)を受け取る様になっているからです。
そのため、下記の様なコードは失敗します。
var
Dic: NSDictionary;
KeyStr: String;
Value: Pointer;
begin
Dic := GetDictionary; // なにか NSDictionary を返す関数とか
KeyStr := 'なんらかのキー';
// 単に NSString をポインタにキャストしてもエラーになる
Value := Dic.objectForKey(Pointer(StrToNSStr(KeyStr)));
end;
正解のコード
var
Dic: NSDictionary;
KeyStr: String;
Key: NSString;
KeyID: Pointer;
Value: Pointer;
begin
Dic := GetDictionary; // なにか NSDictionary を返す関数とか
KeyStr := 'なんらかのキー';
// まずは NSString に変換
Key := StrToNSStr(KeyStr);
// こんな感じで ID 型(実体へのポインタ)に変換してやる
KeyID := (Key as ILocalObject).GetObjectID;
// これで呼び出せる
Value := Dic.objectForKey(KeyID);
end;
ILocalObject
Macapi.ObjectiveC に定義されているインターフェース。
TOCGenericImport など ILocalObject を継承しているクラスでは GetObjectID で Objective-C の生のポインタが手に入ります。
Berlin !!
上のコード面倒くさいと思った?思いましたね!
なんと 10.1 Berlin からは StringToID 関数や NSObjectToID 関数, NSStringToID 関数が使えます。
これらは Macapi.Helpers に定義されています。
これを使って上記を書き直すと…
var
Dic: NSDictionary;
Value: Pointer;
begin
Dic := GetDictionary; // なにか NSDictionary を返す関数とか
Value := Dic.objectForKey(StringToID(’何らかのキー’));
end;
たったこれだけになりますよ!奥さん!
スゴい簡単!!
まとめ
Pointer を受け取るメソッドが上手く動かないときは ILocalObject を思い出して下さい。