2016-05-01 4 views
1

私はいくつかのGoogleの検索結果を見てきたし、nilためNSStringをテストするためのさまざまな方法を発見した、などNSStringの:戻り値や空の文字列

は、だから私はNSStringのためのいくつかのcategoryメソッドを書くことにしました助けて。しかし、それは期待どおりに動作していないと誰かが私が解決策の理由と可能性のあるヘルプを把握するのを助けることができるかどうか疑問に思っています。だから、stringOrEmptyの背後にある考え方は空NSString(ないnilとして結果を強制することです

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

:だからここ

は私が思い付いたものです)オブジェクトが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ああ、私は 'NSString'として' name'を定義していますが、 'nil'は' NSString'メソッドの呼び出しを許可しません。 – RoLYroLLs

+1

nilへのメッセージは何もせず、型に応じて 'nil、Nil、NULL、0、または0.0'を返します。そう、ええ、あなたが正しいです。 – ozgur

答えて

2

nilNSStringまたは任意のオブジェクトのインスタンスではないため、インスタンスメソッドを使用して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 

は、あなたがそれらを呼び出すことができる方法です。nil`オブジェクトは呼び出されません `へのメッセージの送信

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

ありがとう!魅力的に働いた! – RoLYroLLs

+0

'stringOrNil'メソッドは不必要なチェックをしています。ちょうど 'return string.length?文字列:nil; '。そして、 'stringOrEmpty'は' return string?文字列:@ ""; '。 – rmaddy

関連する問題