문제
좋아, 나는 너희들이 내가 왜 그렇게 혼란스러워하는지 빨리 지적 할 수 있다는 느낌이 들지만, 왜 다음이 컴파일러 오류 나 경고를 초래하지 않는지에 대한 질문이있다.
NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];
selectedObject
이다 NSObject
, 그리고 name
a의 이름입니다 @property
유형의 int
.
나에게 당황한 것은 컴파일러가 반환 결과가 의향이있는 이유입니다. [ self.selectedObject valueForKey:name ]
유형입니다 NSNumber *
(타이핑하지 않고) integerValue
.
분명히 KVC는 비 객체 "숫자"유형을 NSNumber
, 그러나 컴파일러가 그것을 알 수있는 방법은 없습니다. -valueForKey:
반환합니다 NSNumber *
이 특별한 경우.
이로 인해 라인을 따라 컴파일러 경고가 발생하지 않는 이유id
응답하지 않을 수 있습니다.-integerValue
'"?
해결책
내가 옳았 으면 좋겠어 : 이건 왜냐하면 id
"특별"입니다. 의 대상 id
유형은 원하는 메시지를 보낼 수 있으며 컴파일러에서 확인한 것이 없으며 모든 것이 런타임에 확인됩니다. 또는, 즉, id
유형은 Objective-C의 "동적 타이핑"부분 인 반면 다른 모든 유형은 다음과 같습니다. NSObject
)는 "정적 타이핑"부분입니다.
이 방법으로 정적 타이핑을 사용하려는 위치와 동적 타이핑을 사용하려는 위치를 선택할 수 있습니다. 다음과 같은 일을하는 것은 완벽하게 합법적입니다.
id str1 = @"Hello";
id str2 = [str1 stringByAppendingString:@", world"];
그러나 보통 당신은 문자열을“단단히”입력합니다. NSString
s, 컴파일 타임 정적 유형 확인의 편의를 얻고 정적 타이핑에만 의존하기 때문에 정적 타이핑에만 의존합니다. valueForKey
상황.
다른 팁
시간이 지나고 우리는 이제 __auto_type
Xcode 8 이후로 사용할 수 있으므로 이제 할 수 있습니다
#define let __auto_type const
#define var __auto_type
let a = @[@"pew pew"];
var b = 2;
b = a; //compiler warning "Incompatible pointer to integer conversion assigning to 'int' from 'NSArray *__strong const'"
그리고 훨씬 더
사실, 나는 이것을 너무 좋아해서 편의를 위해 포드로 만들었습니다.
pod 'SwiftyObjC'