[objective-c] Objective-C에서 클래스의 인스턴스를 @protocol로 캐스트

내가 정의한 프로토콜을 따르거나 따르지 않을 수있는 객체 (UIViewController)가 있습니다.

객체가 프로토콜을 준수하는지 확인한 다음 안전하게 메서드를 호출 할 수 있다는 것을 알고 있습니다.

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}

그러나 XCode는 경고를 표시합니다.

warning 'UIViewController' may not respond to '-protocolMethod'

이 경고를 방지하는 올바른 방법은 무엇입니까? 내가 캐스트 수가 없어 self.myViewControllerA와 MyProtocol클래스입니다.



답변

이를 수행하는 올바른 방법은 다음과 같습니다.

if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}

UIViewController <MyProtocol> *타입 캐스트로 변환 사용한 반면, “VC는 MyProtocol 따를이있는 개체의 UIViewController하다” id <MyProtocol>로 변환을 “VC 미지 클래스 그 MyProtocol에 부합하는 것을 목적으로한다”는.

이런 식으로 컴파일러는 적절한 유형 검사를 제공합니다 vc. 컴파일러는 둘 중 하나에서 선언되지 않은 메서드 UIViewController<MyProtocol>호출 되는 경우에만 경고를 제공합니다 . id캐스트되는 객체의 클래스 / 유형을 모르는 경우에만 사용해야합니다.


답변

다음과 같이 전송할 수 있습니다.

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}

이것은 또한 나를 조금 던졌다. Objective-C에서 프로토콜은 유형 자체가 아니므 idNSObject원하는 프로토콜과 함께 지정해야합니다 (또는 다른 유형 (예 🙂 ).


답변