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

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

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



답변

정식 프로토콜 ” 의 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 () 지시문을 사용하고 메소드 이름을 지정하여 올바른 식별자를 제공 할 수 있습니다.

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


답변

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

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메소드 선언 전에 키워드를 사용하여 선택 사항으로 만드십시오. 그렇게 간단합니다!

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


답변