문제

내가 정의한 프로토콜을 준수하거나 준수하지 않을 수도있는 객체 (UiviewController)가 있습니다.

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

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

그러나 Xcode는 경고를 보여줍니다.

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

이 경고를 방지하는 올바른 방법은 무엇입니까? 캐스팅 할 수없는 것 같습니다 self.myViewController A로 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에서 프로토콜은 유형 자체가 아니므로 지정해야합니다. id (또는 다른 유형 NSObject) 원하는 프로토콜과 함께.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top