내가 정의한 프로토콜을 따르거나 따르지 않을 수있는 객체 (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
원하는 프로토콜과 함께 지정해야합니다 (또는 다른 유형 (예 🙂 ).