6

MonoMac でプロジェクトに取り組み始めたばかりですが、これは今のところかなりクールです。しかし、まだよくわからないことがいくつかあります。例: 配列はどのように使用しますか? 私が見つけたのは次のとおりNSArrayです。呼び出しているメソッドから戻り値を取得し、その配列内のカスタム オブジェクトの 1 つを取得しようとすると、" cannot convert type System.IntPtr to MyType" のようなものが取得され続けます。

NSArray groupArray = (NSArray)groupDictionary.ObjectForKey(key);
MyType myObject = (MyType)groupArray.ValueAt(0);

それは私が返す配列のためです。しかし、自分で配列を作成したい場合はどうすればよいでしょうか? NSArray の実装では、インスタンス化できません。したがって、MonoMac Web サイトが正しく作成されている場合は、このような通常の配列を使用する必要があります

int[] intArray = int[10];

それぞれ、強く型付けされた配列であり、C# での使用方法がわかりません。

それで、ここに行く方法は何ですか?

ありがとう
–f

4

1 に答える 1

11

一般に、NSArray の使用はあまり役に立ちません。なぜなら、上で説明した問題が発生するからです。

これが、一般に NSArray を厳密に型指定された配列に変換する必要がある理由です。MonoMac の低レベル ランタイムは、既にユーザーに代わってすべてのコールバックに対してこれを行います。

通常、次のようにします。

YourType [] stronglyTyped = NSArray.ArrayFromHandle<YourType> (arrayIntPtrHandle);

NSArray は NSObject しか格納できないため、"YourType" は NSObject から派生したオブジェクトである必要があることに注意してください。

それでも NSArray を使用する場合、覚えておく必要があるのは、ValueAt が基になるオブジェクト ハンドル (IntPtr) を返すことです。これを C# で使用するには、これを NSObject に変換する必要があります。これを Runtime.GetNSObject メソッドで行うと、結果を最も派生した型にキャストできます。

YourType x = (YourType) Runtime.GetNSObject (NSArray.ValueAt (0));

そうは言っても、API バインディング ツールを使用して Objective-C API にアクセスしている場合、正しくバインディングしていません。コントラクト API は、NSArray を持つ代わりに、厳密に型指定されたバージョンを持つ必要があります。

 [Export ("getElements")]
 NSArray GetElements ();

次のようになる必要があります。

 [Export ("getElements")]
 YourType [] GetElements ();
于 2010-11-06T16:26:22.337 に答える