답변:
" 정식 프로토콜 " 의 Apple 페이지에서 :
선택적 프로토콜 메소드는 @optional 키워드를 사용하여 선택적으로 표시 할 수 있습니다. @optional 모달 키워드에 해당하는 기본 동작의 의미를 공식적으로 나타내는 @required 키워드가 있습니다. @optional 및 @required를 사용하여 프로토콜을 원하는대로 섹션으로 분할 할 수 있습니다. 키워드를 지정하지 않으면 기본값은 @required입니다.
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
프로토콜의 메소드가 선택 사항으로 표시된 경우, 호출하기 전에 오브젝트가 해당 메소드를 구현하는지 여부를 확인해야합니다.
예를 들어, 원형 차트보기는 다음과 같이 세그먼트 제목 방법을 테스트 할 수 있습니다.
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
respondsToSelector : 메소드는 컴파일 후 메소드의 식별자를 참조하는 선택기를 사용합니다. @selector () 지시문을 사용하고 메소드 이름을 지정하여 올바른 식별자를 제공 할 수 있습니다.
이 예제의 데이터 소스가 메소드를 구현하면 제목이 사용됩니다. 그렇지 않으면 제목은 그대로 유지됩니다.
@protocol MyProtocol <NSObject>
프로토콜은 규칙 세트입니다. 아래 예제와 같이 프로토콜을 만들 수 있습니다.
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
이행:
TestClass.h
#import "TestProtocols.h"
@interface TestClass : NSObject <TestProtocols>
@end
TestClass.m
#import "TestClass.h"
@implemenation TestClass
//optional to implement
-(void)testMethodOptional{
// Your Code
}
//required to implement
-(void)testMethodRequired{
// Your Code
}
@end
프로토콜은 추상 클래스와 동일하게 작동하므로 @optional 키워드는 구현에 선택적인 메소드를 정의합니다.
따라서 코드에서 someMethod1, someMethod2 및 someMethod4는 필수 메소드입니다 (구현해야 함). someMethod3는 선택 사항입니다.이 메소드를 구현하지 않으면 컴파일러에서 경고를 발생시키지 않습니다.
@protocol myPrtocol<NSObject>
-(void)someMethod1:(id)someArgument;
-(void)someMethod2:(id)someArugument;
@optional
-(void)someMethod3:(id)someArgument;
@required //by default
-(void)someMethod4:(id)someArgument;
@end
// sampleClass.m
@interface sampleClass : someSuperClass <myProtocol>
//...
@end