2013-07-24 2 views
0

은 내가 string는 사전에서에 돌려 NSString * 인 경우 이전 개발자가NSNull을 테스트하기 전에 왜 객체에 캐스트해야합니까?

NSObject *object = (NSObject *)string; 
if([object isEqual:[NSNull null]]) 
    return @"none" 

을 떠난 후 상으로 이동 한 프로젝트에 다음과 같은 블록을 가지고있다.

NSNull을 확인해야한다고 생각하지만 누군가 NSObject에 처음 캐스트 한 이유를 말해 줄 수 있습니까?

+0

왜 캐스팅해야한다고 생각하세요? 캐스팅하지 않고 해봤습니까? –

+1

내가 필요하다고 생각하지 않는다. 내가 전에 누군가가 캐스팅이 필요하다고 생각한 이유가 있는지 묻고있다. – James

+1

NSNull의 클래스에서 이것을 볼 수있다. @interface NSNull : NSObject 그렇게 생각하지 않는다. NSNull 또한 NSObject이기 때문에 검사하기 전에 타입 변환을해야하지만 그 반대의 경우도 마찬가지입니다. – satheeshwaran

답변

3

캐스팅은 불필요합니다. 이 아니라는 것을 알기 전까지 (예 : 컬렉션에서 방금 꺼낸 경우) 일반적으로 객체를 id으로 유지하는 것이 가장 좋습니다. 실제로 NSNull 일 수있는 NSString*이 있으면 혼동을 줄 수 있습니다. 아마 원래의 저자는 그 문자열이 실제로 뭔가 다른 것이 될 수 있다는 것을 분명히하고 싶었을 것입니다.

또한 NSNull은 싱글 톤으로 문서화되어 있으므로 ==을 사용하여 비교할 수 있습니다 (원하는 경우).

+1

Objective-C에서 문자열을 비교하려면 ==를 사용하는 것이 가능합니까? 그것은 결과를 위반할 수 있습니다. 그렇게 생각하지 않아? 일반적으로 ==는 숫자 비교에 사용됩니다. –

+0

그러나 [NSNull null] (싱글 톤)과 비교하면 안전합니다. –

+0

문자열이 null이 아닌 경우,'[NSNull null]'에 대한 ==는 false가됩니다. –

0

실제로 캐스트 문자열 (NSString 클래스의 객체 인 경우)을 NSObject에 입력 할 필요가 없습니다. 어쨌든 NSObject은 Objective-C의 루트 클래스이므로 모든 유형의 개체가 될 수 있습니다. NSString 클래스도 NSObject을 상속합니다. 따라서 NSObject *object = (NSObject *)string도 유효합니다.

if([string isEqual:[NSNull null]]) 
    return @"none" 

또한 도움이됩니다.

idNSObject 대신 제네릭 종류를 유지하는 것이 가장 좋습니다. @ 마이크 - 웰러 말했듯이

0

, 가장 좋은 방법은 다음과 같습니다

if(string == [NSNull null]){ 
    return @"none" 
} 

는 'NSNull는 싱글 톤 패턴을 사용하여 발생합니다.

관련 문제