2010-01-16 4 views
8

좋아, 내가 왜 이렇게 혼란스러워하는지 빨리 알 수있을 것 같은 느낌이 들지만 다음 이유가 컴파일러가되지 않는 이유는 무엇인지 궁금하다. 오류 또는 경고 :Objective-C 유형 추론

NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ]; 

selectedObjectNSObject이며, name 유형 int@property의 이름을 발생합니다. 저를 당혹 무엇

컴파일러가 [ self.selectedObject valueForKey:name ]의 반환 결과가 integerValue를 호출 체인을 위해 메시지를 (그것을 타입 캐스팅없이) 타입 NSNumber *이다 가정 완벽하게 기꺼이 이유입니다.

물론, KVC는 NSNumber에 비 객체 "번호"형식을 래핑하지만 컴파일러는 -valueForKey:이 특별한 경우에 NSNumber *을 반환 할 것을 알 수있는 방법이 없습니다.

"id"행에 따라 컴파일러 경고가 표시되지 않는 이유는 무엇입니까 '-integerValue' "에 응답하지 않을 수 있습니까?

답변

10

나는 그것이 올바르게 되었으면 좋겠다. 이것은 id이 "특별하다"때문이다. id 유형의 객체는 원하는 모든 메시지를 보낼 수 있으며 컴파일러가 수행 한 검사는 없으며 런타임에 모든 것이 검사됩니다. 즉, id 유형은 Objective-C의 "동적 유형 지정"부분이며 다른 모든 유형 (예 : NSObject)은 "정적 유형 지정"부분입니다.

이 방법을 사용하면 정적 입력을 사용하려는 위치와 동적 입력을 사용하려는 위치를 선택할 수 있습니다. 이 같은 것을 할 완벽하게 합법적이다

id str1 = @"Hello"; 
id str2 = [str1 stringByAppendingString:@", world"]; 

을하지만 당신은 컴파일시 정적 유형 검사의 편의를 얻을 수 있기 때문에 일반적으로는, NSString들로 "꽉"문자열을 입력 한 경우에만 동적 타이핑 곳으로 리조트 정적 인 것은 valueForKey 상황 에서처럼 방해가 될 것입니다.

+0

감사! Objective-C의 특권 타입 인'id '와 관련이 있다는 느낌이 들었습니다. :) 내 경향은 항상 타이트하게 입력 할 때마다 가능하기 때문에, 나는이 겉보기에 이상한 행동을 만난 적이 없을 것 같아요. 추측에 따르면 이드는 강력하고 위험합니다. 컴파일러에게 'id'를 다룰 때 어떤 상황을 주도록 타입 변환하는 것이 더 나은지 궁금하거나, 'id'가 무엇이 될지에 대한 긍정적 인면을 완벽하게 남겨 두는 것이 좋다면 (예에서와 같이) . – LucasTizma

+0

엄지 손가락의 규칙은 "가능한 경우 정적 타이핑, 필요할 때 동적 타이핑"입니다 (Google에서 더 자세한 정보를 얻을 수 있습니다).이 경우 나는 타이프하지 않을 것이고, 이는 표현식을 읽기가 더 어렵게 만듭니다. 때로는 컴파일러가 올바른 방법을 선택하는 데 도움이되도록 유형 변환해야합니다 (http://stackoverflow.com/questions/1113270 참조). – zoul

+0

링크를 제공해 주셔서 감사합니다. 기존 SDK 메서드 이름과 "충돌"하는 메서드 이름의 결과로 불쾌한 버그가 발생했습니다. 컴파일러가 나에게 미쳤다고 생각 했어. :) 그리고 그렇습니다. 저는 "정적 타이핑 어디서 가능하고 다이내믹 타이핑이 필요한지"철학을 전적으로지지합니다. 이제 Objective-C 만 형식화 된 컬렉션에 대한 지원을 추가한다면 ... 필자는 필자의 컬렉션이 저장할 것임을 알고있다. – LucasTizma