酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xamarin.iOSでDictionary<TK, TV>型からNSDictionary型オブジェクトへ変換する

TinamiをみるアプリをXamarin.iOSで作りました。実験的な作り方をしていて、まだほとんど何もできません(Tinamiのランキングを見て、ふぁぼるくらいです)。

https://itunes.apple.com/jp/app/illust-catcher/id933153646?mt=8&uo=4&at=10l8JW&ct=hatenablog

このアプリでは、アプリの設定値を保存するのにNSUserDefaultsを直接触っています。ちなみにXamarin.iOSでNSUserDefaultsに設定値を保存する方法はこちらで紹介しています。

しかし、Android版を開発しようとした時に設定値を保存するコードが異なるのは、少し使い勝手が悪いのでラッパーのようなものを書いています。

Dictionary<string, string>型からNSDictionary型オブジェクトへ変換する

Dictionary<TK, TV>型のオブジェクトをNSUserDefaultsで保存するためには、ネイティブ側の型(NSDictionary)のオブジェクトに変換する必要があります。

この変換が面倒臭いので何か良い方法はないかと調べていたところ、NSDictionary.FromObjectsAndKeysメソッドというobject[]を引数に取るメソッドがありました。これはイケるのでは!と思って下記のコードを書きました。

var dict = new Dictionary<string, string>();
dict["aaa"] = "aaa";
dict["bbb"] = "bbb";

var nsdict = NSDictionary.FromObjectsAndKeys(
    dict.Keys.Cast<object>().ToArray(),
    dict.Values.Cast<object>().ToArray());

var count = nsdict.Count;

この時のcountの値は2でした。NSDictionary.FromObjectsAndKeysメソッドで第2引数のvaluesにstring型のオブジェクトを渡せば、よしなに計らってくれて内部的にNSString型へ変換してくれるようです。

おまけ:Dictionary<string, object>型からNSDictionary型オブジェクトへ変換する

よしなに計らってくれるNSDictionary.FromObjectsAndKeysメソッドに甘えて、以下のようなコードを書きました。

var dict = new Dictionary<string, object>();
dict["aaa"] = "aaa";
dict["bbb"] = new NSString("bbb");
dict["ccc"] = 1;
dict["ddd"] = 393.9f;

var nsdict = NSDictionary.FromObjectsAndKeys(
    dict.Keys.Cast<object>().ToArray(),
    dict.Values.Cast<object>().ToArray());

var count = nsdict.Count;

結果としてcountの値は4でした。デバッガーを使ってnsdictの中を見てみると全てNSString型になっているのが分かります。

f:id:ch3cooh393:20141119105037p:plain

このことから、objectの型から適切にNSStringやNSNumberに変換してくれるわけではなく、object.ToString()した結果をNSStringに突っ込んでいるのかなと思いました。

関連記事

Xamarin.iOSを使ってアプリ開発する際に逆引きとしてお使いください。