كيفية تعيين القيم المتغيرة والوصول إليها من فئة أخرى

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

  •  04-10-2019
  •  | 
  •  

سؤال

أقوم بتعديل تطبيق Quartzdemo مثال وأريد القيام بتعيين وقراءة قيم متغيرات نوع عدد صحيح في فئات أخرى تم تضمينها بالفعل.

على سبيل المثال ، في MainViewController.m ، أريد تعيين قيمة رقمية (أرقام بسيطة من 1-100) إلى متغير سيتم استدعاؤه بعد ذلك (قراءة) في ملف quartzimages.m.

السؤال هو كيفية تحديد المتغير بشكل صحيح ، وضبط والوصول (اقرأ) القيمة.

أنا مبتدئ مع OBJ C و iPhone SDK بشكل عام ولدي بعض الخبرة مع Delphi و VB ولكن هذا لا يساعد على الإطلاق :)

شكرا لك ، أيا كان وأينما كنت ، شخص سيأخذني من حلقة googling التي لا نهاية لها.

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

المحلول

إذا كان لديك متغير ، فهناك طريقتان لقراءة الخصائص وتعيينها (والتي عادة ما تكون مزيجًا من طرق IVAR والملحق). الطريقة القديمة (التي لا يزال يفضلها البعض) هي استخدام طرق الملحقات مباشرة:

//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]

الطريقة الجديدة هي استخدام Dot-Syntax (الذي يعمل فقط مع الخصائص ، ولا يمكن استخدامه بطرق أكثر تعقيدًا):

int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]

إذا كان هذا الأمر محيرًا لك ، فإنني أوصي بشدة بالتقاط نسخة من كتاب هارون هيليجاس. وهذا ما يفسر الكاكاو والهدف C بتفصيل كبير.

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

السبب الرئيسي لذلك هو زيادة المرونة-إذا كان لدي فصل Person هذا له متغير مثيل age, ، على سبيل المثال ، قد أرغب في تغيير عملي في المستقبل لتحديد العمر ديناميكيًا. إذا تعتمد فئات أخرى على متغير المثيل age, ، سوف ينكسر عندما يتغير التنفيذ.

تتمثل الطريق في هذه المشكلة في استخدام Accessors ، وهي الطرق التي تتحكم في الوصول إلى Ivar. في الهدف-C ، احصل "getters" على المتغير ، وعادة ما يتم تسميته بنفس الشيء مثل المتغير (لذلك في Person على سبيل المثال ، سيكون getter -(int)age) و "Setters" تعيين المتغير (سيتم تسميته -(void)setAge:(int)theAge). إذا كنت تستخدم Accessors ، فيمكنك تغيير تطبيقك بحرية في المستقبل ، حتى التخلص من IVAR تمامًا إذا لزم الأمر ، دون كسر فصول الاعتماد.

في الهدف-C ، غالبًا ما يطلق على الجمع بين IVAR و Accessors "خاصية" (على الرغم من أنه لا يلزم وجود IVAR ، إذا تم إنشاء القيمة ديناميكيًا). إذا كنت تفكر فيما يتعلق بالخصائص ، فلا داعي للقلق بشأن Ivars في فصول أخرى-فهي تفاصيل التنفيذ. يحتوي Objective-C 2.0 على بعض السكر النحوي اللطيف لإنشاء خصائص:

//Person.h
@interface Person : NSObject {
    int age;
}

@property (assign) int age;  //declares the accessors

@end

//Person.m
@implementation Person

@synthesize age; //implements -(int)age and -(void)setAge:theAge

@end

الشيء المهم الذي يجب تذكره هو معظم الوقت ، يجب أن تفكر من حيث الخصائص بدلاً من الإيفار. يجب ألا تصل مباشرة إلى إيفار في فصول أخرى. نادراً ما تصل (إن وجدت) إلى إيفار في فئات فائقة. إذا كنت نقيًا ، فلا يجب عليك حتى الوصول مباشرة إلى IVARs في نفس الفصل إلا في الوصول إلى الأماكن المميزة ، init, ، و dealloc (والأخير يخضعان للنقاش).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top