NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var는 2가됩니다. 그래서, 왜? 나는 다이나믹 타이핑에 관해서는 솔직함을 이해하고 있지만, 그 내용은 무엇입니까?NSString에 NSString 할당하기
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var는 2가됩니다. 그래서, 왜? 나는 다이나믹 타이핑에 관해서는 솔직함을 이해하고 있지만, 그 내용은 무엇입니까?NSString에 NSString 할당하기
이 코드 예에서는 캐스팅이 수행되지 않습니다. [string intValue]
은 정수로 저장된 값을 검색하기 위해 NSNumber
이 제공하는 일반 Objective C 방법입니다. NSString
포인터에 객체를 할당했다는 사실은 아무 것도 바뀌지 않습니다 : 내부의 객체는 NSNumber
입니다. Objective C는 동적 유형의 언어이기 때문에 충돌이 발생하지 않습니다. 그것은 당신이 잘못된 유형의 객체를 할당 할 수 있습니다,하지만 당신은 당신의 string
객체에 NSString
의 메소드를 호출하려고하면, 당신은 충돌을받을 예정 :
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue]; // OK
BOOL isTwo = [string isEqualToString:@"2"]; // Crash
나는 그가 NSNumber 객체를 NSString * 변수에 할당했기 때문에 OP에 생각합니다. 거기에 문자열이 있다는 것입니다. –
예, 주요 질문은 그 코드가 작동하는 이유입니다. NSNumber가 NSString에 할당 된 다음 intValue가 int에서 해당 문자열을 변환했습니다. – alex
@alex NSNumber 객체는 포인터 변수에 할당되었습니다.이 포인터 변수는 NSString 포인터이지만 할당 된 객체는 여전히 NSNumber입니다. 변환이 수행되지 않습니다. 'intValue'를 호출하면, 그것은'NSNumber' 객체에서 호출됩니다. 어떠한 종류의 문자열도 관련되어 있지 않습니다. – rmaddy
[string intValue]
에 대한 호출 정말 message expression이다. 이것은 string
이 실제로 NSNumber
개체를 가리키고 있으며 intValue
메시지에 응답하기 때문에 작동합니다. rangeOfString
과 같은 NSString 클래스에만 해당하는 메시지를 보내려고하면 "선택기를 인식하지 못함"오류가 발생합니다.
디버거에서이 코드를 실행하고 중단 점을 넣으면 런타임에서 string
의 유형이 실제로 NSNumber
임을 알게됩니다.
NSNumber
이라는 참조를 저장 한 다음 나중에 다시 변환하는 문자 변환이 없습니다. 너는 NSString
도 필요 없다. id
id this = [NSNumber numberWithInt:22];
int val = [this intValue];
NSLog(@"%d",val);
나는 어떤 주조도 보이지 않는다. 정확히 무엇을 요구하고 있습니까? –
타입 캐스팅이 있습니다. 그러나 암시 적입니다. id에서 NSString *. 그러나 물론, 그는 뭔가 다른 것을 말하고 싶었습니다. –
@ AminNegm-Awad는 동적 유형 지정입니다. – vikingosegundo