2012-07-08 72 views
0

我有一種情況,我創建了一個NSArray的NSManagedObjects,它們都是從CoreData實體派生的。問題是這個數組中有多個實體,但是數組中的每個實體都有我想要檢索的「name」屬性。從NSManagedObject訪問具有多種實體類型的子屬性

我來自C++的背景,如果我面臨這個問題,我會做另一個類,我想使用的屬性,並讓所有的子對象繼承自NSManagedObject,並與我喜歡的屬性類。不幸的是,我不能看到用Objective C做到這一點的一種方式,因爲它不支持多重繼承,我無法弄清楚處理像這樣的小OOP問題的範例。 :(

--- ---背景

對我怎麼樣應對的使用情況是,我想填補一個UITableView與來自不同對象的各種字符的細胞。所有的角色有一個名字,但它們都是唯一的對象類型,現在我可以做一個類型就好像這樣:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CharNameCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    CharacterWizard *wizards = (CharacterWizard*)[self.characters objectAtIndex:indexPath.row]; 
    cell.textLabel.text = wizards.name; 

    return cell; 
} 

但是,正如你所看到的,這打破了,當我有不同類型的I「M。當然,有一個更加優雅的解決方案可以解決這個問題,但是以前的其他語言經驗在我的方式上(我想)。希望這個時間不會太長題目了。

回答

1

一種方法是定義一個Character類,使CharacterWizard等,類似的類成Character子類:

@interface Character : NSManagedObject 
@property (nonatomic, strong) NSString *name; 
@end 

@interface CharacterWizard : Character 
@property (nonatomic, strong) NSMutableArray *spells; 
@end 

@interface CharacterFighter : Character 
// ... 
@end 

另一種方法是使用一個protocol,並把所有的NSManagedObjects的實施協議。例如,您的協議可能是:

@protocol HasName 
@property (nonatomic, strong) NSString *name; 
@end 

...那麼你CharacterWizard類將聲明它實現(並會着手實施)HasName

@interface CharacterWizard : NSManagedObject <HasName> 

...然後你的代碼可以引用一個實現HasName協議的通用對象(並且可以調用協議的方法)在不知道實際的類對象的:

id <HasName> jenkins = [self.characters objectAtIndex:indexPath.row]; 
cell.textLabel.text = jenkins.name; 

如果您的其他課程是CharacterFighter,CharacterRogue等,我可能會推薦Character選項。如果name屬性是只有你的類共同的東西,那麼協議會更有意義。

相關問題