LoginSignup
2
1

More than 5 years have passed since last update.

Delphi で NSDictionary.objectForKey を使う方法(Berlin では簡単になったよ!)

Last updated at Posted at 2016-04-21

概要

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 を思い出して下さい。

2
1
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
2
1