إعداد نوع البدائية العقارات المزدهر في الهدف C

StackOverflow https://stackoverflow.com/questions/1032116

سؤال

وأنا أحاول أن أكتب مكتبة بحيث يكون عام بما فيه الكفاية أن لها فائدة. المشكلة هي أنه يحتاج إلى تحديث خصائص الطبقات الأخرى، فإن كلا من الملكية والطبقة يجب أن تكون دينامية.

والآن أستطيع أن أفعل ذلك باستخدام المتغيرات العمومية أي مشكلة، وأنا مجرد تمرير مؤشر إلى متغير أريد تحديث. ومع ذلك فإنه أيضا يكون من المفيد بشكل لا يصدق لتعيين خصائص الطبقات أيضا، حيث يتم استخدامها حتى تحرري في موضوعي C.

والآن مرة أخرى هذا ليس مشكلة طالما أن الخاصية هي نوع الكائن، في محاولة لتعيين خصائص نوع البدائية.

قانون بلدي الحالي يبدو شيء على طول هذه الخطوط لخصائص:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];

ولكن طريقة setArgument يسمح فقط لأنواع المؤشر، بعد ويسمح للخصائص لديك أي نوع بدائي. هل هناك أي طريقة لتعيين خصائص نوع البدائية حيوي؟

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

المحلول

والمنظمة من أن تفعل تحويل لك:

[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];

وسيتم تحويل NSNumber إلى int إذا تم تعريف myVar الخاص بك على النحو التالي:

int myVar;
...
@propery (nonatomic) int myVar;

نصائح أخرى

و"إلا أن طريقة setArgument يسمح فقط لأنواع مؤشر" كنت في عداد المفقودين شيء. والحجة لsetArgument: ليست هي البيانات التي يتم تمريرها إلى الأسلوب. هذا هو عنوان للبيانات (من مهما نوع) التي يتم تمريرها. الحق الآن التعليمات البرمجية يأخذ فوق عنوان مؤشر الكائن (وهو مؤشر إلى مؤشر). يمكنك جعل بسهولة مثلما يستغرق عنوان عدد صحيح (لا يهمني). وبعبارة أخرى، نفس رمز بالضبط يعمل بالفعل بغض النظر عن نوع:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top