2010-11-06 26 views
5

我剛開始在MonoMac中開展一個項目,目前這個項目非常酷。但還有一些我不確定的事情。例如:你如何使用數組?這是我發現的:當我從我調用的方法中獲得NSArray時,我嘗試獲取該數組中的一個自定義對象,我總是收到類似「cannot convert type System.IntPtr to MyType」的東西。在MonoMac中使用陣列的正確方法

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

這是我回來的數組。但是如果我想自己創建一個數組呢? NSArray的實現不允許我實例化它。所以,如果我得到了MonoMac website正確的,我應該使用一個普通的數組像這樣

int[] intArray = int[10]; 

分別爲強類型的數組,我不知道如何在C#中使用它。

那麼去這裏怎麼走?

感謝
-f

回答

10

一般情況下,使用NSArray的是不是很有用,因爲你結束了,你上述問題。

這就是爲什麼一般你應該將NSArray轉換成強類型數組。 MonoMac低級運行時已經爲您代表所有回調執行此操作。

通常你會做這樣的:

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

注意的NSArray只能存儲NSObjects,所以「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(); 
+0

由於米格爾,該訣竅!最好。 – flohei 2010-11-08 07:22:06