2013-02-14 2 views
-1

1>이 작업을 수행하지 않고/avail/consume 프로토콜을 사용하는 다른 방법이 있습니까? @interface MyClass : NSObject <SomeProtocol>.objective-c 프로토콜의 몇 가지 개념에 관한 도움이 필요합니다.

2>이 클래스를 수행하지 않고 클래스가 위임 클래스의 대리자가 될 수 있습니까? @interface MyClass : NSObject <SomeProtocol>.

3> 나는이 myVar1 어떤 클래스의 객체를 개최한다하지만 클래스는 <aProtocol>를 구현해야한다는 것을 의미 이러한

id<aProtocol> *myVar1;에 대한 수정이 있습니까?

AClass<bProtocol> *myVar2; 즉, myVar2AClass의 개체를 보유 할 것이며, <bProtocol>도 구현해야합니까? <someProtocol> 상속의 인터페이스 하지(MyClass <someProtocol> *)[[MyClass alloc] init];MyClass을하고 어떤이

4

>.

+0

가까운 득표 수는 무엇입니까? OP는 일반적인 질문보다 나은 직접적인 질문을했습니다. "나는 어떤 코드를 썼는데 ... 작동하지 않습니다."항상 질문받는 스타일의 질문을했습니다. –

+0

또한 프로토콜을 "상속받지"않는다는 사실에 주목할 가치가 있습니다. 아래의 Paul의 대답에서 클래스'myClass'는 프로토콜'someProtocol'을 따릅니다 (클래스, 프로토콜 및 카테고리 이름을 대문자로 입력해야합니다). – wmorrison365

+0

@ wmorrison365 클래스 명명 규칙을 지적 해 주셔서 감사합니다. –

답변

2
  1. 예, 객체가 프로토콜의 필수 인터페이스를 구현하는 한 해당 객체는 본질적으로 프로토콜에 명시 적으로 부합하는 객체를 나타낼 수 있습니다. 이렇게하면 필요한 메소드를 구현하는지 확인하는 데 도움이되는 컴파일러가 느슨해집니다. 따라서 일반적으로 명시 적으로 클래스를 프로토콜에 부합한다고 선언하는 것이 가장 좋습니다.

    나는이 객체가 비공식적으로 요구되는 메소드를 구현한다는 점에서 비공식적으로 적합하다는 것을 의미하지만, 단순히 객체가 그것을 따르고 있음을 명시하지는 않는다. 예 : 이 객체는 @required 메쏘드를 구현할 때 유효한 UITableViewDataSource이 될 것입니다. 그러나 단지 선언하지 않습니다.

    @interface MyObject : NSObject 
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
    @end 
    

    다시 당신은 분명 이러한 관계를 확인해야합니다 실제로 @interface MyObject : NSObject <UITableViewDataSource>

  2. 가)id<aProtocol> *myVar1; 별표 id<aProtocol> myVar1;없이 작성해야 당신이 맞는지 말하고 이것은 당신이라는 변수가 있다고 말하고있다 myVar1aProtocol과 일치해야합니다. 거짓말 일 수 있습니다. (3에 대한 답변 참조)
    b)it must also implement <bProtocol>이 너무 강하기 만하면 정확합니다 다시 여기

  3. 당신의 반환 형식에서 캐스팅을 수행 (3 대답을 참조) 거짓말이 될 수 - 어떤이가 말하고있는 것은 당신이 변수가 myVar2라고하고 bProtocol을 준수해야 함을 가지고있다 방법은 myClass ~ myClass<someProtocol>이 될 것입니다. 이것은 본질적으로 컴파일러에게 "객체가 myClass 유형의 객체를 반환하지만 실제로는 myClass<someProtocol>이 될 것이라고 말합니다."라고 말합니다. 본질적으로 myClass@interface myClass : NSObject <someProtocol>으로 정의되지 않은 경우 컴파일러에게 거짓말을하고 컴파일러에서 알려줄 수없는 버그를 소개 할 가능성이 있습니다.

당신은 내가 어떤 문제없이이 코드를 컴파일 할 수 있습니다 예를 들어 컴파일러 (컴파일러가 매우 영리하다) 침묵하는 일을 주조주의해야하지만

UIView *view = (id)@"Hey I'm not a view"; 
view.frame = CGRectZero; 
+0

(2b)에 대해서는 ''이라고 생각합니다. – wmorrison365

+0

@ wmorrison365 응원가 –

+0

@ Paul.s 답장을 보내 주셔서 감사합니다. 나는이 요점 "객체가 프로토콜의 필수 인터페이스를 구현"을 얻지 못했다. MyClass 과 같은 의미인가? –

0

하는 보완하기 위해 런타임에 충돌합니다 Paul.s의 대답은 클라이언트 코드에서 채택 할 필요가없는 "비공식 프로토콜"개념입니다. 비공식 프로토콜은 실제로 NSObject의 범주이며 프로토콜이 아닙니다. 이 개념은 이제 프로토콜에서 "선택적"방법의 개념으로 대체되었습니다 (이 프로토콜은 사용자의 myClass에서 선택적으로 구현할 수있는 방법을 선언 할 수 있습니다).

자세한 내용은 ios protocol docs을 참조하십시오.

관련 문제