2010-11-06 32 views
5

Tôi mới bắt đầu làm việc trên một dự án ở MonoMac, điều này khá thú vị cho đến nay. Nhưng vẫn còn một số điều tôi không chắc chắn. Ví dụ: Bạn sử dụng mảng như thế nào? Đây là những gì tôi phát hiện ra: Khi tôi nhận được một NSArray trở lại từ một phương pháp tôi đang gọi và tôi cố gắng để có được một trong các đối tượng tùy chỉnh trong mảng đó tôi tiếp tục nhận được một cái gì đó như "cannot convert type System.IntPtr to MyType".Cách thích hợp để sử dụng mảng trong MonoMac

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

Đó là các mảng tôi quay lại. Nhưng nếu tôi muốn tự mình tạo ra một mảng thì sao? Việc thực hiện NSArray không cho phép tôi khởi tạo nó. Vì vậy, nếu tôi nhận MonoMac website đúng, tôi nên sử dụng một mảng bình thường như thế này

int[] intArray = int[10]; 

tương ứng một mảng mạnh mẽ, đánh máy mà tôi không biết làm thế nào để sử dụng nó trong C#.

Vì vậy, con đường để đi đến đây là gì?

Cảm ơn
-f

Trả lời

10

Nói chung, sử dụng NSArray không phải là rất hữu ích, bởi vì bạn kết thúc với những vấn đề mà bạn mô tả ở trên.

Đây là lý do tại sao nói chung bạn nên chuyển đổi NSArray thành một mảng được đánh máy mạnh. Thời gian chạy cấp thấp MonoMac thực hiện điều này cho tất cả các cuộc gọi lại đã thay mặt bạn.

Thông thường, bạn sẽ làm điều này:

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

Lưu ý rằng NSArray chỉ có thể lưu trữ NSObjects, vì vậy "YourType" cần phải là một đối tượng có nguồn gốc từ NSObject. Bây giờ, nếu bạn vẫn muốn sử dụng NSArray, những gì bạn cần nhớ là ValueAt trả về xử lý đối tượng bên dưới (IntPtr), để sử dụng điều này với C#, bạn cần phải chuyển đổi nó thành một NSObject. Bạn làm điều này bằng phương pháp Runtime.GetNSObject, bạn có thể đúc kết quả với các loại có nguồn gốc nhất:

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

Điều đó đang được nói, nếu bạn đang sử dụng các công cụ ràng buộc API để truy cập vào một API Objective-C, bạn có không ràng buộc mọi thứ một cách chính xác. API của bạn hợp đồng thay vì nên của việc có một NSArray nên có phiên bản mạnh mẽ gõ, vì vậy:

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

Sẽ trở thành:

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

Cảm ơn Miguel, mà đã làm các trick! Tốt. – flohei

Các vấn đề liên quan