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에 새로운 것이 아니다
이것은 KVC와 특별히 관련이 없습니다. 'id s = @ "WATERMELONS"; [s lowercaseString]; id r = s; [r lowercaseString]; '같은 결과가 나타납니다. –
그래, 이치에 맞는 것 같아. 그래서 당신은 더 이상 이드의 프로토콜을 따르는 어떤 메시지도 보낼 수 없습니까? – johan
'id'는 모두 무료입니다. 컴파일러는 그 객체가 ObjC 객체라는 것을 알고 있습니다. 프로토콜을 지정할 때 타입을 약간 제한했습니다. 기본적으로 "MyProtocol"의 메소드가있는 한 실제로 이것이 무엇인지는 신경 쓰지 않습니다.하지만 컴파일러처럼 보입니다. 그것은 가능한 한 제한적입니다. 그 프로토콜의 _Only_ 메소드가 컴파일됩니다. 나는 왜 그런지 모르겠다. 유형 이론에 이유가있을 수 있습니다. –