문제

좋아, 나는 너희들이 내가 왜 그렇게 혼란스러워하는지 빨리 지적 할 수 있다는 느낌이 들지만, 왜 다음이 컴파일러 오류 나 경고를 초래하지 않는지에 대한 질문이있다.

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"];

그러나 보통 당신은 문자열을“단단히”입력합니다. NSStrings, 컴파일 타임 정적 유형 확인의 편의를 얻고 정적 타이핑에만 의존하기 때문에 정적 타이핑에만 의존합니다. 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'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top