0

我有一种情况,我创建了一个 NSManagedObjects 的 NSArray,这些 NSManagedObjects 都派生自 CoreData 实体。问题是这个数组中有多个实体,但是数组中的每个实体都有一个我想检索的“名称”属性。

我来自 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;
}

但是,正如你所看到的,当我有不同的类型时,这就会崩溃。我确信有一个更优雅的解决方案来处理这个问题,但是以前使用其他语言的经验阻碍了我(我认为)。希望这不是一个太长的问题。

4

1 回答 1

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

另一种方法是使用协议,并让所有 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;

Character如果您的其他课程是CharacterFighter,等,我可能会推荐该选项CharacterRogue。如果name属性是你的类唯一的共同点,那么协议会更有意义。

于 2012-07-08T07:19:58.600 回答