선택적인 방법으로 프로토콜을 만드는 방법은 무엇입니까?


133

UIActionSheetDelegate예를 들어 프로토콜 과 같이 iPhone SDK에 정의 된 여러 프로토콜에서 옵션으로 표시된 방법을 발견했습니다 .

내 프로토콜을 어떻게 정의하고 몇 가지 방법을 선택 사항으로 설정할 수 있습니까?

답변:


248

" 정식 프로토콜 " 의 Apple 페이지에서 :

선택적 프로토콜 메소드는 @optional 키워드를 사용하여 선택적으로 표시 할 수 있습니다. @optional 모달 키워드에 해당하는 기본 동작의 의미를 공식적으로 나타내는 @required 키워드가 있습니다. @optional 및 @required를 사용하여 프로토콜을 원하는대로 섹션으로 분할 할 수 있습니다. 키워드를 지정하지 않으면 기본값은 @required입니다.

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

4
참고 : '' '@optional' ''및 '' '@required' ''지시문은이 지시문을 따르는 모든 메소드에 적용됩니다.
Wayne

31

프로토콜의 메소드가 선택 사항으로 표시된 경우, 호출하기 전에 오브젝트가 해당 메소드를 구현하는지 여부를 확인해야합니다.

예를 들어, 원형 차트보기는 다음과 같이 세그먼트 제목 방법을 테스트 할 수 있습니다.

NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

respondsToSelector : 메소드는 컴파일 후 메소드의 식별자를 참조하는 선택기를 사용합니다. @selector () 지시문을 사용하고 메소드 이름을 지정하여 올바른 식별자를 제공 할 수 있습니다.

이 예제의 데이터 소스가 메소드를 구현하면 제목이 사용됩니다. 그렇지 않으면 제목은 그대로 유지됩니다.


7
반드시 당신 프로토콜에 NSObject의를 확장 할 수 있도록하는 respondsToSelector 사용
Fracdroid

1
오른쪽과 같은@protocol MyProtocol <NSObject>
로렌스 Kesteloot

이것은 완벽한 답변입니다!
smoothdvd

14

프로토콜은 규칙 세트입니다. 아래 예제와 같이 프로토콜을 만들 수 있습니다.

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

12

@optional메소드 선언 전에 키워드를 사용하여 선택 사항으로 만드십시오. 그렇게 간단합니다!

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end

6

프로토콜은 추상 클래스와 동일하게 작동하므로 @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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.