2014-09-18 3 views
1

Xcode 6에서 키 값 코딩 문제가 발생했습니다. 프로토콜을 준수하는 ID에 키 값 코딩을 사용하는 것은 불가능한 것처럼 보입니다. 속성이 ID로 선언하면 내가 컴파일러 오류가 프로토콜을 준수하기 위해 ID를 설정하면프로토콜에 맞는 KVC ID 유형

컴파일러는

@property (nonatomic, strong) id foo; 

[foo setValue:@"value" forKey:@"key"]; 

을 동의합니다. "선택자에 대한 알려진 인스턴스 메소드가 없습니다 ...". 나는이 같은 NSObject의에 유형을 설정하면

@property (nonatomic, strong) id<MyProtocol> foo; 

[foo setValue:@"value" forKey:@"key"]; 

그것은 작동 :

@property (nonatomic, strong) NSObject<MyProtocol> *foo; 

[foo setValue:@"value" forKey:@"key"]; 

프로토콜 "MyProtocol는"NSObject의 준수하지만, 지금까지의 내가 객체를 이해 서브 클래스로 할 필요가있다 KVC가 작동하려면 NSObject를 사용해야합니다. 그러나 첫 번째 시나리오는 왜 작동하지만 두 번째 시나리오는 작동하지 않습니까?

이 엑스 코드 6에 새로운 것이 아니다
+0

이것은 KVC와 특별히 관련이 없습니다. 'id s = @ "WATERMELONS"; [s lowercaseString]; id r = s; [r lowercaseString]; '같은 결과가 나타납니다. –

+0

그래, 이치에 맞는 것 같아. 그래서 당신은 더 이상 이드의 프로토콜을 따르는 어떤 메시지도 보낼 수 없습니까? – johan

+0

'id'는 모두 무료입니다. 컴파일러는 그 객체가 ObjC 객체라는 것을 알고 있습니다. 프로토콜을 지정할 때 타입을 약간 제한했습니다. 기본적으로 "MyProtocol"의 메소드가있는 한 실제로 이것이 무엇인지는 신경 쓰지 않습니다.하지만 컴파일러처럼 보입니다. 그것은 가능한 한 제한적입니다. 그 프로토콜의 _Only_ 메소드가 컴파일됩니다. 나는 왜 그런지 모르겠다. 유형 이론에 이유가있을 수 있습니다. –

답변

3

(. 난 그냥 엑스 코드 5.1.1을 테스트하고 오류가 발생했습니다) 규칙은 다음과 같습니다

  • 이 컴파일러는 당신이 id 베어 어떤 메시지를 보내 드릴 것입니다 .

  • 컴파일러는 메시지가 명명 된 프로토콜 중 하나에 의해 정의 된 경우에만 id<Protocol1, Protocol2, Protocol3, ...>으로 메시지를 보냅니다.

  • 컴파일러는 메시지가 또는이라는 클래스에서 명명 된 프로토콜 중 하나에 의해 정의 된 경우에만 SomeClass<Protocol1, Protocol2, Protocol3, ...>으로 메시지를 보냅니다. 클래스에 의해 정의 된 메시지에는 해당 수퍼 클래스 및 해당 범주로 정의 된 메시지가 포함됩니다.

setValue:forKey: 방법은 NSObject classNSKeyValueCoding category 정의된다. NSObject protocol에 정의되어 있지 않습니다.

+0

이 프로토콜 유형 검사의 제한에 대해 생각할 수있는 특별한 이유가 있습니까? –

+0

실수를 피하는 데 도움이 될 것으로 생각합니다. 자신이하는 일을 안다면'id'로 변환하는 것이 쉽지만 모든 메시지가 유효하다고 생각하면 IDE에서 지침을 얻기가 어렵습니다. –