IT

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

lottoking 2020. 8. 26. 08:08
반응형

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


내가 정의한 프로토콜을 따르거나 않을 것입니다.

객체가 프로토콜을 준수하는지 확인한 다음 신뢰할 수있는 방법을 호출 할 수 있는지 확인합니다.

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원하는 프로토콜과 함께 지정해야합니다 (또는 다른 유형 (예 :) ).

참고 URL : https://stackoverflow.com/questions/617616/cast-an-instance-of-a-class-to-a-protocol-in-objective-c

반응형