2016-05-01 196 views
1

我一直在尋找在谷歌的幾個搜索結果和發現各種方式來測試NSStringnil的NSString:返回值或空字符串

所以我決定寫一些category方法NSString到幫幫我。然而,它並沒有像預期的那樣工作,我想知道是否有人可以幫助我找出解決方案的原因和可能的幫助。

所以這是我想出了:

NSString+Extenstions.h

#import 

@interface NSString (Extensions) 

- (NSString *)stringOrNil; 
- (NSString *)stringOrEmpty; 

@end

NSString+Extenstions.m

#import "NSString+Extensions.h" 

@implementation NSString (Extensions) 

- (NSString *)stringOrNil { 
    return self == nil || [self length] == 0 ? nil : self; 
} 

- (NSString *)stringOrEmpty { 
    return [self stringOrNil] == nil ? @"" : self; 
} 

@end

所以後面stringOrEmpty的想法是給力的結果爲空NSString(不nil )如果對象是nil或長度爲0.

測試:

NSString *name = nil; 
NSLog(@"%@", [name stringOrEmpty]); // result: (null)

我所料,上面的結果是一片空白,但控制檯登錄它(null)。 S我將stringOrEmpty方法更改爲return [[self stringOrNil] length] == 0 ? @"yes" : @"no";,預計會看到yes,但是又獲得(null)。好像stringOrEmpty沒有被調用。

最後,我測試了以下內容:NSLog(@"%@", [name class]);,結果又是(null)

我誤會了什麼嗎?如果值爲nil或真正爲空,我如何編寫一個可返回空白NSString值的類別?

謝謝!

+3

發送消息'nil'對象不會被調用。它只是返回零。您需要將它們定義爲類方法。 – ozgur

+0

@ozgur啊,所以即使我將'name'定義爲'NSString',給它'nil'死亡不允許調用'NSString'方法嗎? – RoLYroLLs

+1

給nil的消息不做任何事情,並根據類型返回'nil,Nil,NULL,0或0.0'。所以是的,你是對的。 – ozgur

回答

2

nil不是NSString或任何對象的實例,因此您無法使用實例方法處理nil

nil的消息什麼都不做,它甚至不會被調用。它只是簡單地返回nil。您需要將其定義爲類方法:

@interface NSString (Extensions) 

+ (NSString *)stringOrNil:(NSString *)string; 
+ (NSString *)stringOrEmpty:(NSString *)string; 

@end 

-

@implementation NSString (Extensions) 

+ (NSString *)stringOrNil:(NSString *)string { 
    return string.length ? string : nil; 
} 

+ (NSString *)stringOrEmpty:(NSString *)string { 
    return string ? string : @""; 
} 

@end 

這裏是你如何稱呼他們:

NSString *name = nil; 
NSLog(@"%@", [NSString stringOrEmpty:name]); // result: ("") 
+0

謝謝!像魅力一樣工作! – RoLYroLLs

+0

'stringOrNil'方法有一個不必要的檢查。只要'返回string.length?字符串:無;'。而'stringOrEmpty'應該是'返回字符串?字符串:@「」;'。 – rmaddy