좋아, 내가 왜 이렇게 혼란스러워하는지 빨리 알 수있을 것 같은 느낌이 들지만 다음 이유가 컴파일러가되지 않는 이유는 무엇인지 궁금하다. 오류 또는 경고 :Objective-C 유형 추론
NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];
selectedObject
는 NSObject
이며, name
유형 int
의 @property
의 이름을 발생합니다. 저를 당혹 무엇
컴파일러가 [ self.selectedObject valueForKey:name ]
의 반환 결과가 integerValue
를 호출 체인을 위해 메시지를 (그것을 타입 캐스팅없이) 타입 NSNumber *
이다 가정 완벽하게 기꺼이 이유입니다.
물론, KVC는 NSNumber
에 비 객체 "번호"형식을 래핑하지만 컴파일러는 -valueForKey:
이 특별한 경우에 NSNumber *
을 반환 할 것을 알 수있는 방법이 없습니다.
"id
"행에 따라 컴파일러 경고가 표시되지 않는 이유는 무엇입니까 '-integerValue
' "에 응답하지 않을 수 있습니까?
감사! Objective-C의 특권 타입 인'id '와 관련이 있다는 느낌이 들었습니다. :) 내 경향은 항상 타이트하게 입력 할 때마다 가능하기 때문에, 나는이 겉보기에 이상한 행동을 만난 적이 없을 것 같아요. 추측에 따르면 이드는 강력하고 위험합니다. 컴파일러에게 'id'를 다룰 때 어떤 상황을 주도록 타입 변환하는 것이 더 나은지 궁금하거나, 'id'가 무엇이 될지에 대한 긍정적 인면을 완벽하게 남겨 두는 것이 좋다면 (예에서와 같이) . – LucasTizma
엄지 손가락의 규칙은 "가능한 경우 정적 타이핑, 필요할 때 동적 타이핑"입니다 (Google에서 더 자세한 정보를 얻을 수 있습니다).이 경우 나는 타이프하지 않을 것이고, 이는 표현식을 읽기가 더 어렵게 만듭니다. 때로는 컴파일러가 올바른 방법을 선택하는 데 도움이되도록 유형 변환해야합니다 (http://stackoverflow.com/questions/1113270 참조). – zoul
링크를 제공해 주셔서 감사합니다. 기존 SDK 메서드 이름과 "충돌"하는 메서드 이름의 결과로 불쾌한 버그가 발생했습니다. 컴파일러가 나에게 미쳤다고 생각 했어. :) 그리고 그렇습니다. 저는 "정적 타이핑 어디서 가능하고 다이내믹 타이핑이 필요한지"철학을 전적으로지지합니다. 이제 Objective-C 만 형식화 된 컬렉션에 대한 지원을 추가한다면 ... 필자는 필자의 컬렉션이 저장할 것임을 알고있다. – LucasTizma