Cocoa의 물체 공장에 대한 논쟁으로 클래스 이름을 어떻게 전달할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/315591

문제

나는 작은 객체 모음을 추적하기 위해 물체 공장에서 작업하고 있습니다. 객체는 다른 유형 일 수 있지만 모두 응답합니다. createInstance 그리고 reset. 객체는 공통 기본 클래스에서 파생 될 수 없습니다. 일부는 내장 코코아 클래스에서 파생되어야하기 때문입니다. NSView 그리고 NSWindowController.

원하는 클래스 이름을 다음과 같이 단순히 내 공장에 전달하여 적합한 객체의 인스턴스를 만들 수 있기를 원합니다.

myClass * variable = [factory makeObjectOfClass:myClass];

그만큼 makeObjectOfClass: 방법은 다음과 같이 보입니다.

- (id)makeObjectOfClass:(CLASSNAME)className
{
    assert([className instancesRespondToSelector:@selector(reset)]);
    id newInstance = [className createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

내가 한 것처럼 클래스 이름을 메소드로 전달하는 방법이 있습니까? (CLASSNAME)className 논쟁 makeObjectOfClass: 위에?

완전성을 위해 여기에 모든 객체를 관리하고 싶은 이유가 있습니다. 한 번에 전체 객체 세트를 호출하여 재설정 할 수 있기를 원합니다. [factory reset];.

- (void)reset
{
    [managedObjects makeObjectsPerformSelector:@selector(reset)];
}
도움이 되었습니까?

해결책

함수를 사용하여 문자열을 클래스로 변환 할 수 있습니다 : nsclassfromstring

Class classFromString = NSClassFromString(@"MyClass");

그러나 귀하의 경우에는 클래스 객체를 직접 사용하는 것이 좋습니다.

MyClass * variable = [factory makeObjectOfClass:[MyClass class]];

- (id)makeObjectOfClass:(Class)aClass
{
    assert([aClass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [aClass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

다른 팁

나는 그것에 대한 더 나은 튜토리얼을 가지고 있습니다. 체크 아웃하십시오https://appengineer.in/2014/03/13/send-class-name-as-a-argument-in-ios/

클래스를 동적으로 지정하는 것은 매우 쉽습니다. 실제로 이름으로 참조 할 수 있습니다.

id string = [[NSClassFromString(@"NSString") alloc] initWithString:@"Hello!"];
NSLog( @"%@", string );

또 다른 팁은 대부분의 다른 코코아 프로그래머가 코어 데이터에서 nsmanagedObject로 그것을 읽을 것이기 때문에 명명법 '관리 대상'을 사용하지 않습니다. 또한 다양한 유형의 객체 모음을 관리하는 대신 글로벌 NSNotification (모든 재설정 가능한 객체가 가입)을 사용하는 것이 더 쉬울 수도 있지만, 나보다 결정을 내릴 수있는 정보가 더 많습니다.

다른 답변에서 누락 된 대답은 당신이 @protocol 당신의 +createInstance 그리고 +reset 행동 양식.

다음과 같은 것을 원하는 것 같습니다.

- (id)makeObjectOfClassNamed:(NSString *)className
{
    Class klass = NSClassFromString(className);
    assert([klass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [klass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

이것은 이름이 지정된 클래스 방법을 가정합니다 +createInstance. 아니면 그냥 사용할 수 있습니다 [[klass alloc] init].

그것을 부르려면 :

MyClass *variable = [factory makeObjectOfClassNamed:@"MyClass"];

당신이하려는 일에 따라 문자열보다 클래스 객체를 통과하는 것이 더 나을 수 있습니다.

MyClass *variable = [factory makeObjectOfClass:[MyClass class]];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top