2012-07-08 2 views
0

나는 CoreData 엔티티에서 파생 된 NSManagedObjects의 NSArray를 만든 상황이 있습니다. 문제는이 배열에 여러 엔티티가 있지만 배열의 각 엔티티에 검색하려는 "이름"속성이 있다는 것입니다.여러 엔티티 유형이있는 NSManagedObject에서 하위 속성에 액세스

저는 C++ 배경에서 왔습니다.이 문제에 직면했다면 속성을 가진 다른 클래스를 만들었고 모든 자식 개체를 NSManagedObject에서 상속 받고 해당 클래스를 원하는 속성으로 상속받습니다. 불행하게도 Objective C로 다중 상속을 지원하지 못하므로 이처럼 작은 OOP 문제를 처리하기위한 패러다임을 이해할 수 없기 때문에 Objective C로이 작업을 수행하는 방법을 볼 수 없습니다. :(

--- 배경 ---

내가 처리하고있는 무슨에 대한 사용 사례 시나리오 내가 여러 개체 유형에서 다양한 캐릭터에서 세포와 jQuery과 채우도록하려는 것입니다. 모든 문자 이름을 가지고 있지만, 그들은 모두 고유 한 개체 유형입니다 지금 내가 이렇게 잘 한 가지 유형의 작업을 수행 할 수 있습니다. 당신이 볼 수 있듯이,

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

을하지만, 이것은 내가 다른 유형이있을 때 고장 나는 "m. 이 문제를 다루는 좀 더 우아한 해결책이 있겠지만 다른 언어들에 대한 이전의 경험이 여기에있다. (나는 생각한다.)이 언어가 너무 길지 않기를 바란다. uestion.

답변

1

한 가지 방법은 Character 클래스를 정의 할 수 있으며, Character의 서브 클래스로 CharacterWizard 및 기타 유사한 클래스를 만들 것 :

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

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

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

또 다른 방법은 당신의 NSManagedObjects의 모든 구현 protocol를 사용하도록 할 것 프로토콜. 예를 들어, 프로토콜이 될 수있다 :

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

가 ... 다음 CharacterWizard 클래스 HasName 그것을 구현하는 것을 선언 할 것이다 (그리고 구현하기 위해 진행 것) : 다음

@interface CharacterWizard : NSManagedObject <HasName> 

... 그리고 코드를

(실제로는 프로토콜의 메소드를 호출 할 수있는 HasName 프로토콜

다른 클래스가 CharacterFighter, CharacterRogue 등인 경우 Character 옵션을 사용하는 것이 좋습니다. name 속성이 인 경우에만 클래스가 공통적으로 갖는 일 경우 프로토콜이 더 적합합니다.

관련 문제