나는 프로토콜과 같이 있습니다정의 조건은
@protocol ProfileSubObjects <NSObject, NSCoding>
@required
- (BOOL) hasGraph;
@optional
- (NSArray *) xGraphValues;
- (NSArray *) yGraphValues;
내가 hasGraph은 YES와 같은 경우는이 두 가지 선택 방법을 요구 만들고 싶어. 가능합니까?
나는 프로토콜과 같이 있습니다정의 조건은
@protocol ProfileSubObjects <NSObject, NSCoding>
@required
- (BOOL) hasGraph;
@optional
- (NSArray *) xGraphValues;
- (NSArray *) yGraphValues;
내가 hasGraph은 YES와 같은 경우는이 두 가지 선택 방법을 요구 만들고 싶어. 가능합니까?
아니요. 메소드가 프로토콜에 필요하거나 그렇지 않습니다. 한 가지로, -hasGraph의 값은 컴파일 할 때 알려지지 않습니다. 클래스 메소드가 아닌 인스턴스 메소드이기 때문에 특정 객체를 작성할 때까지는 런타임에 알 수 없습니다. 또한 객체는 서로 다른 시간에 -hasGraph에 대해 다른 값을보고 할 수 있습니다.
여기서 가장 좋은 점은 -hasGraph가 YES를 반환하면 -xGraphValues 및 -yGraphValues가 구현되어야한다는 사실을 간단하게 문서화하는 것입니다. 예외를 던지거나, 정상적으로 작동하지 않을 수 있으며 그런 방법을 구현하지 않으면 데이터를 그릴 수 없습니다. 메서드를 호출하기 전에 구현되었는지 여부를 확인하려면 -respondsToSelector : 메서드를 사용하십시오.
그건 불가능합니다. hasGraph의 결과는 런타임시에만 알려지며 프로토콜의 필수/선택 부분은 컴파일 타임에 컴파일러가 체크 아웃하는 데 사용됩니다.
아마도 hasGraph가 YES를 반환하면 xGraphValues 및 yGraphValues가 구현되어야하며 공식 프로토콜에 약간의 비공식 성을 가져야한다는 강점을 추가하는 것이 좋습니다. 객체가의 특정 작업을 수행 할 수 있도록 당신이 위해 필요한 프로토콜의 부분을 구현하는지 여부를 런타임에 확인하려면
if([object respondsToSelector:@selector(xGraphValues)] &&
[object respondsToSelector:@selector(yGraphValues)])
: 당신은 항상 뭔가를 할 수 있습니다. 비 순응 객체를 구현하는 누군가가 디버그 빌드를 통해 잘못한 것을 찾을 수있게하려면 NSAssert에 그러한 것들을 넣는 것이 현명 할 것입니다.
아니요, 불가능합니다. 적어도, 이것처럼. 그러나 더 깊은 문제가 있습니다. 이 질문은 컴파일 대 런타임 검사와 객체 지향에 대한 고려를 제안합니다.
@optional 또는 @required로 표시하는 것은 해당 객체가 구현을 제공하는 프로토콜 계약을 충족하는지 또는 해당 메소드의 @optional 인 경우가 아닌지 컴파일 시간 검사를 수행하고자 함을 의미합니다.
따라서 런타임 변수의 값 (이 경우 hasGraph)에 따라 컴파일 시간을 확인할 필요가 없습니다.
더 나은 방법은 respondsToSelector 메시지 확인을 이용하는 것입니다. 또는 그래프가 있고 x와 y 그래프 값을 제공하는 하위 클래스를 가질 수 있습니다.
그걸로 무엇을 이루고자합니까? – Jano