0

すべて CoreData エンティティから派生した NSManagedObjects の NSArray を作成した状況があります。問題は、この配列に複数のエンティティがあることですが、配列内の各エンティティには、取得したい「名前」プロパティがあります。

私は C++ のバックグラウンドを持っており、この問題に直面した場合は、使用したいプロパティを持つ別のクラスを作成し、すべての子オブジェクトを NSManagedObject から継承し、そのクラスに好きなプロパティを持たせます。残念ながら、Objective C は多重継承をサポートしておらず、このような小さな OOP 問題を処理するためのパラダイムを理解できないため、Objective C でそれを行う方法がわかりません。:(

- -バックグラウンド - -

私が扱っているユースケースのシナリオは、さまざまなオブジェクトタイプのさまざまな文字のセルで UITableView を埋めたいということです。すべてのキャラクターには名前がありますが、それらはすべて固有のオブジェクト タイプです。今、私は次のように1つのタイプをうまく実行できます:

    - (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

1 つのアプローチは、クラスを定義し、CharactermakeCharacterWizardおよびその他の同様のクラスを のサブクラスにすることです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、などである場合は、おそらくこのオプションをお勧めしますCharacterRoguenameプロパティがクラスに共通する唯一のものである場合、プロトコルはより理にかなっています。

于 2012-07-08T07:19:58.600 に答える