2010-11-06 15 views
5

Acabo de empezar a trabajar en un proyecto en MonoMac, que es bastante bueno hasta ahora. Pero todavía hay algunas cosas de las que no estoy seguro. Por ejemplo: ¿cómo utilizas las matrices? Esto es lo que descubrí: cuando recibo un NSArray de un método al que llamo y trato de obtener uno de los objetos personalizados en ese arreglo, sigo obteniendo algo así como "cannot convert type System.IntPtr to MyType".Forma correcta de usar matrices en MonoMac

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

Eso es para las matrices que recibo. Pero, ¿y si quiero crear una matriz por mi cuenta? La implementación de NSArray no me permite crear una instancia. Así que si me dieron el MonoMac website razón, debería utilizar una matriz común como esto

int[] intArray = int[10]; 

respectivamente un conjunto inflexible de tipos que yo no estoy al tanto de cómo utilizarlo en C#.

Entonces, ¿cuál es el camino a seguir aquí?

Gracias
-f

Respuesta

10

En general, el uso de NSArray no es muy útil, porque se termina con los problemas que se ha descrito anteriormente.

Por esta razón, en general, debe convertir NSArray en una matriz fuertemente tipada. El tiempo de ejecución de bajo nivel de MonoMac hace esto para todas las devoluciones de llamada que ya están en su nombre.

lo general, se podría hacer esto:

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

Tenga en cuenta que sólo puede NSArray NSObjects la tienda, por lo que "YourType" tiene que ser un objeto derivado de NSObject.

Ahora, si aún desea utilizar el NSArray, lo que debe recordar es que ValueAt devuelve el identificador subyacente del objeto (el IntPtr), para usarlo con C#, necesita convertirlo en un NSObject. Esto se hace con el método Runtime.GetNSObject, puede convertir el resultado al tipo más derivados:

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

Dicho esto, si está utilizando la herramienta de unión API para acceder a una API Objective-C, que está no atando las cosas correctamente Su contrato de API en su lugar debe de tener un NSArray debe tener la versión estricta de tipos, por lo que:

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

debe convertirse en:

[Export ("getElements")] 
YourType [] GetElements(); 
+0

Gracias Miguel, que hizo el truco! Mejor. – flohei

Cuestiones relacionadas