2012-11-12 2 views
1

MBManagedSquareMBManagedCircle이라는 하위 클래스가 NSManagedObject이라고 가정 해 보겠습니다. MBManagedSquareMBManagedCircle은 방법 prepareFromDictionary:(NSDictionary*)dic을 정의하며 두 가지 구현이 서로 다릅니다. Objective C로 캐스팅

NSString *type = // could be @"MBManagedSquare" or @"MBManagedCircle" 
NSEntityDescription *desc = [NSEntityDescription entityForName:type inManagedObjectContext:_context]; 
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:desc insertIntoManagedObjectContext:_context]; 

그래서이 코어 데이터와 함께있을 것입니다 엔티티의 유형이 type 문자열을 통해 동적으로 결정됩니다

는이 코드를 말한다. 그래서 제가 아는 것은 그것이 NSManagedObject이라는 것입니다.

내가 원하는 것은 올바른 수업을 위해 prepareFromDictionary: 방법을 사용하는 것입니다.

그래서 타입을 "MBManagedSquare"인 경우, 내가 MBManagedSquare에 개체를 캐스팅하고 내가하고 시도 무엇

[castedObject prepareFromDictionary:dic]; 

를 호출 할

은 다음과 같습니다

Class class = NSClassFromString(type); 
class *castedObject = (class*)object; 

하지만 나는를 얻을 수 예상 된 표현 오류. 이것이 가능한지 확실하지 않습니다. 어떻게하면 좋을까요?

+1

당신은 iVar를 iVar로 캐스팅하고 있습니다. 그거 이상 하네. 캐스트에서 대문자 클래스를 사용하고 참조 연산자 (*)를 제거하십시오. 물론 모든 객체가'-class'에 응답한다고 생각하면, 그 이유는 모르겠다. – CodaFi

+0

@CodaFi 이것도 작동하지 않는다 : Class class = NSClassFromString (type); class * castedObject = (Class) object; ' – Snowman

답변

2

선택기와 해당 매개 변수가 일치하는 경우 올바른 클래스를 호출하는 것에 대해 걱정할 필요가 없습니다. ObjC에는 많은 동적 디스패치 권한이 있습니다.

는 지금까지, 그것은 하나에 꽤 흔한 일 구현으로 :

  • 인터페이스와 공통의 기반을 만들려면
  • 를 원하거나 두 클래스가 채택 프로토콜 작성 :

MONProtocol을 .h

S, MBManagedSquare 또는 MBManagedCircle) 중 하나는 기본에서 파생 또는 프로토콜을 채택하고처럼 변수를 선언 :

// if subclass 
MBManagedShape * castedObject = (MBManagedShape*)object; 

또는

// if protocol 
NSManagedObject<MONManagedShapeProtocol>* castedObject = 
         (NSManagedObject <MONManagedShapeProtocol>*)object; 
+0

그러나 하위 클래스 기법을 사용하여 호출 할 대상을 어떻게 알 수 있습니까? 귀하의 예제에서 MBManagedShape는 수퍼 클래스가 맞습니까? Circle과 Square 클래스는 prepareFromDictionary에 대한 구현이 다르므로 올바른 메서드를 호출해야합니다. – Snowman

+1

실제로 Core Data를 사용하여, [NSEntityDescription entityForName : @ "MBManagedCircle"inManagedObjectContext : _context]'와 같은 엔티티 설명으로 엔티티를 초기화하면 반환 된 객체가 자동으로 올바른 유형으로 형변환됩니다. 얼마나 편리한 지! – Snowman

+0

@mohabitar a) 당신은 알 필요가 없습니다; 사용할 구현이 메시지를 보내는 인스턴스와 일치합니다. 다이나믹 디스패치. b) 예 c) 각 반은 그것을 다르게 시행 할 수 있습니다. – justin

0

가 캐스팅에 대한 필요가 없습니다. 객체는 또는이거나 함수가 한 번만있을 수 있습니다. 좋은지 확인 : respondsToSelecctor : @selector (prepareFromDictionary :)