سؤال

لقد بدأت للتو العمل في مشروع في Monomac ، وهو أمر رائع حتى الآن. لكن لا يزال هناك بعض الأشياء التي لست متأكدًا منها. على سبيل المثال: كيف تستخدم المصفوفات؟ إليك ما اكتشفته: عندما أحصل على NSArray العودة من طريقة أتصل بها وأحاول الحصول على أحد الكائنات المخصصة في تلك الصفيف ، ما زلت أحصل على شيء مثل "cannot convert type System.IntPtr to MyType".

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

هذا للصفائف أعود. ولكن ماذا لو أردت إنشاء صفيف بمفردي؟ لا يسمح لي تنفيذ NSArray بإinestants. لذلك إذا حصلت على موقع Monomac حسنًا ، يجب أن أستخدم صفيفًا عاديًا مثل هذا

int[] intArray = int[10];

على التوالي صفيف قوي من النوع الذي لست على علم بكيفية استخدامه في C#.

إذن ما هي السبيل للذهاب إلى هنا؟

شكرًا
-F

هل كانت مفيدة؟

المحلول

بشكل عام ، فإن استخدام NSArray ليس مفيدًا للغاية ، لأنك انتهى بك الأمر بالمشاكل التي وصفتها أعلاه.

هذا هو السبب بشكل عام في تحويل nsarray إلى صفيف مكتوب بقوة. يقوم مونوماك بوقت التشغيل منخفض المستوى لجميع عمليات الاسترجاعات بالفعل نيابة عنك.

عادة ما تفعل هذا:

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

لاحظ أن NSArray لا يمكنه تخزين nsobjects إلا ، لذلك يجب أن يكون "yourtype" كائنًا مستمدًا من NSObject.

الآن ، إذا كنت لا تزال ترغب في استخدام NSArray ، فإن ما تحتاج إلى تذكره هو أن Valueat يعيد مقبض الكائن الأساسي (INTPTR) ، لاستخدام هذا مع C# تحتاج إلى تحويل هذا إلى nsobject. يمكنك القيام بذلك باستخدام طريقة التشغيل.

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

ومع ذلك ، إذا كنت تستخدم أدوات ربط واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات COSTIVE-C ، فأنت لا تلتزم بالأشياء بشكل صحيح. يجب أن يكون لدى واجهة برمجة تطبيقات العقد بدلاً من وجود nsarray النسخة المكتوبة بقوة ، لذلك:

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

ينبغي أن تصبح:

 [Export ("getElements")]
 YourType [] GetElements ();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top