首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

iOS CoreData 多型陣列中判斷物件實際類別:.class 回傳子類別名稱

     編輯:DB2 教學

iOS CoreData 多型陣列中判斷物件實際類別:.class 回傳子類別名稱

在使用 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 指標更安全。
  • CoreData 應用場景: 在 NSFetchRequest 回傳多型實體陣列時,可透過此機制動態轉型並存取子類別專屬屬性,實現靈活的資料映射邏輯。

進階提示

若需處理大量異構實體,建議建立「實體類別對應處理器字典」,以類別名稱為 Key、對應處理 Block 為 Value,消除冗長的 if-else 鏈,提升程式碼可維護性與擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved