الهدف C ، كيفية الاستعلام إذا كان كائن من فئة معينة
-
25-09-2019 - |
سؤال
أنا مستمد من TableViewCell. عندما أقوم بالاستعلام عن عرض الجدول حول مسار الفهرس ، فإنه يعيد UitableViewCell. كيف أجد ما إذا كان هذا الكائن أحد نوعي المخصص "CustomCell"؟
المحلول
if ([cell isKindOfClass:[CustomCell class]]) {
[(CustomCell*)cell customCellMethod];
}
نصائح أخرى
if ([cell isKindOfClass:[CustomCell class]]) {
// ...
}
كما هو الحال دائمًا في التصميم الموجهة للكائنات ، فإن محاولة استخدام هوية فئة مثيل هي رائحة رمز وينبغي أن ترفع العلم. ما الذي تحاول القيام به بالضبط مع زنزانتك المخصصة؟ ربما يمكن لشخص ما اقتراح نهج أفضل.
لا أم ما ، من الأفضل أن يعتمد تصميمه على واجهة (أ @protocol
في Objective-C Speak) من فئة لأنه يساعد على فصل التصميم الخاص بك. تحديد أ @protocol
مع واجهة برمجة التطبيقات ذات الصلة التي تحتاجها ولديك CustomCell
تنفيذ هذا البروتوكول. في الكود الخاص بك يمكنك بعد ذلك الاختبار:
if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
//...
}
بدلا من اختبار الهوية الطبقية.
إذا كنت بحاجة فقط إلى طريقة واحدة ، يمكنك استخدامها [cell respondsToSelector:@selector(myMethod)]
.
هناك بالفعل طريقتان يمكنك استخدامهما هنا. الشخص الذي ربما تريده هو isKindOfClass:
, ، ولكن هناك طريقة أخرى تسمى isMemberOfClass:
وهذا سيعود فقط YES
إذا كان جهاز الاستقبال مثيلًا للفئة المقدمة ، فليست مثيلًا للفئة الفرعية.
على سبيل المثال ، إذا DerivedClass
هي فئة فرعية من BaseClass
, ، هنا هي نتائج كل طريقة:
BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO