Objective-C의 @protocol에 클래스 인스턴스를 캐스팅
-
03-07-2019 - |
문제
내가 정의한 프로토콜을 준수하거나 준수하지 않을 수도있는 객체 (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
) 원하는 프로토콜과 함께.
제휴하지 않습니다 StackOverflow