在使用 CoreData 進行資料庫封裝時,查詢結果皆繼承自 NSManagedObject,但具體子類別(如 Student、Teacher)屬性各異。如何在遍歷父類別陣列時,準確識別每個物件的真實子類別並進行對應賦值?驗證證實:使用 .class 可直接取得實際子類別名稱。
NSMutableArray *array = [NSMutableArray array];
NSMutableArray *array2 = [NSMutableArray array];
for (int i = 0; i < 5; i++) {
Student *stu1 = [[Student alloc] init];
stu1.name = [NSString stringWithFormat:@"jack%d", i];
[array addObject:stu1];
Teacher *teacher = [[Teacher alloc] init];
teacher.name = [NSString stringWithFormat:@"limei%d", i];
[array2 addObject:teacher];
}
// 以父類別 Person 接收遍歷
for (Person *p in array) {
NSLog(@"%@------", p.class); // 輸出:Student
}
for (Person *p in array2) {
NSLog(@"%@------", p.class); // 輸出:Teacher
}
// 實際業務判斷邏輯
for (Person *p in array2) {
if (p.class == [Student class]) {
NSLog(@"是學生");
} else {
NSLog(@"不是學生");
}
}
// 直接檢查陣列首個元素類別
if ([array[0] class] == [Student class]) {
NSLog(@"是學生");
} else {
NSLog(@"不是學生,是 %@", [array[0] class]);
}
object.class 或 [object class] 仍會回傳實際的子類別類別物件(如 Student、Teacher),而非父類別 Person。if ([obj isKindOfClass:[Student class]]) 進行型別判斷,支援繼承體系檢查,比直接比較 class 指標更安全。NSFetchRequest 回傳多型實體陣列時,可透過此機制動態轉型並存取子類別專屬屬性,實現靈活的資料映射邏輯。若需處理大量異構實體,建議建立「實體類別對應處理器字典」,以類別名稱為 Key、對應處理 Block 為 Value,消除冗長的 if-else 鏈,提升程式碼可維護性與擴展性。