إعداد نوع البدائية العقارات المزدهر في الهدف C
-
06-07-2019 - |
سؤال
وأنا أحاول أن أكتب مكتبة بحيث يكون عام بما فيه الكفاية أن لها فائدة. المشكلة هي أنه يحتاج إلى تحديث خصائص الطبقات الأخرى، فإن كلا من الملكية والطبقة يجب أن تكون دينامية.
والآن أستطيع أن أفعل ذلك باستخدام المتغيرات العمومية أي مشكلة، وأنا مجرد تمرير مؤشر إلى متغير أريد تحديث. ومع ذلك فإنه أيضا يكون من المفيد بشكل لا يصدق لتعيين خصائص الطبقات أيضا، حيث يتم استخدامها حتى تحرري في موضوعي 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];