Objective-C에서 클래스의 인스턴스를 @protocol로 캐스트
내가 정의한 프로토콜을 따르거나 않을 것입니다.
객체가 프로토콜을 준수하는지 확인한 다음 신뢰할 수있는 방법을 호출 할 수 있는지 확인합니다.
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
원하는 프로토콜과 함께 지정해야합니다 (또는 다른 유형 (예 :) ).
참고 URL : https://stackoverflow.com/questions/617616/cast-an-instance-of-a-class-to-a-protocol-in-objective-c
'IT' 카테고리의 다른 글
임시 분산 쿼리를 활성화하는 방법 (0) | 2020.08.26 |
---|---|
할당 왼쪽의 자바 개체 대괄호 표기법 ({Navigation} =) (0) | 2020.08.26 |
Go에서 마이 구리 프로세스의 stdout 파이프 리디렉션 (0) | 2020.08.26 |
모달로 콘텐츠 다시로드 (twitter 부트로 콘텐츠) (0) | 2020.08.26 |
ASP.NET Core를 사용하여 쿼리에서 값을 읽는 방법은 무엇입니까? (0) | 2020.08.26 |