2013-04-30 2 views
7

Objective C에서 동적으로 캐스트하고 인스턴스 속성에 액세스하려고합니다. 여기에 의사 코드 :객관적인 c에서 id에서 class로 동적 유형 캐스트 ​​

id obj; 
if (condition1) 
    obj = (Class1*)[_fetchedResults objectAtIndex:indexPath.row]; 
else 
    obj = (Class2*)[_fetchedResults objectAtIndex:indexPath.row]; 

NSNumber *latitude = obj.latitude; 

그런 다음 컴파일러는 나에게 말한다 다음 재산 '위도'유형의 객체를 찾을 수 없습니다 'ID를 __strong'

어느 클래스 1과 Class2의 핵심 데이터 엔티티이며, 거의 동일한 종류의 속성을 가지고 있습니다. 조건 1 _fetchedResults은 Class1 및 조건 2 유형의 객체를 반환합니다. _fetchedResults은 Class2 유형의 객체를 반환합니다.

누군가가 이런 종류의 문제를 해결하는 방법에 대한 힌트를 줄 수 있습니까?

감사합니다.

+0

우선 [_fetchedResults objectAtIndex : indexPath.row]가 반환하는 클래스에 위도 속성이 있는지 확인해야한다고 생각합니다. 또한, 없음 NSManagedObject 형식을 NSManagedObject 형식으로 캐스팅 중 하나가 잘못되었습니다. 언제나 NSManagedObjectContext가 필요하지만 NSManagedObject 인스턴스를 생성해야합니다. –

답변

4

당신은 (KVC) 키 - 밸류 코딩을 통해 속성에 액세스 할 수 있습니다 :

[obj valueForKey:@"latitude"] 
+0

KVC를 사용하면 컴파일러에서 유형 검사를 수행하지 않습니다. – ipmcc

+3

@ipmcc 처음에는'id'를 사용합니다 :-) – Monolo

+0

@Monolo 이것은 불필요하며 [obj 위도] – hooleyhoop

1

obj 변수는 당해 재산이있는 형식이어야합니다. 두 엔티티가 모두 동일한 특성을 갖는 경우이를 달성하는 한 가지 방법은 공통 기본 클래스에서 특성을 선언하는 것입니다. 이 같은 id<LatitutdeHaving>을 것으로 obj를 선언 할 것, 거기에서

@protocol LatitudeHaving 
@property (copy) NSNumber* latitude; 
@end 

@interface Class1 (AdoptLatitudeHaving) <LatitudeHaving> 
@end 

@interface Class2 (AdoptLatitudeHaving) <LatitudeHaving> 
@end 

:이 두 가지 유형의 공통 기본 클래스를 공유하는 것이 적절하지 있다면, 당신은 그들과 같은 공통의 프로토콜을 채택 할 수 :

id<LatitudeHaving> obj; 
if (condition1) 
    obj = (Class1*)[_fetchedResults objectAtIndex:indexPath.row]; 
else 
    obj = (Class2*)[_fetchedResults objectAtIndex:indexPath.row]; 

NSNumber *latitude = obj.latitude; 

그리고 그렇게해야합니다. FWIW, 프로토콜은 Java의 인터페이스와 유사합니다.

+0

Class1 * 및 Class2 * 형은 무엇입니까? – hooleyhoop

+0

'objectAtIndex :'는'id '이 아닌'id'를 반환합니다. 이러한 캐스트는 컴파일러의 불만을 피하기 위해 꼭 필요한 것은 아니지만 가능한 한 OP 코드에 가깝게 코드를 작성하려고했습니다. – ipmcc