7

オブジェクトの最良の文字列表現をどのように取得しidますか?

次は正しいですか?もっと簡単な方法はありますか?

id value;
NSString* valueString = nil;
if ([value isKindOfClass:[NSString class]]) {
    valueString = value;
} else if ([value respondsToSelector:@selector(stringValue)]) {
    valueString = [value stringValue];
} else if ([value respondsToSelector:@selector(description)]) {
    valueString = [value description];
}
4

3 に答える 3

8

このdescriptionメソッドはNSObjectプロトコルの一部であるため、Cocoa内のすべてのオブジェクトがそれに応答します。したがって、送信することができますdescription

for( id obj in heterogeneousCollection ){
    [obj description];
}

また、指定子に引数として渡されたオブジェクトNSLog()に送信します。description%@

このメソッドは、ロギング/デバッグ以外の目的には使用しないでください。つまり、フレームワークのバージョン間で特定の形式を持つフレームワーククラスの記述に依存してはならず、別の記述文字列に基づいてオブジェクトを構築するなどの作業を開始する必要があります。

于 2012-08-20T17:21:22.317 に答える
3

すべてのオブジェクトはNSObjectを継承するため、それらはすべてdescriptionメソッドに応答します。クラスでこのメソッドをオーバーライドするだけで、目的の結果を得ることができます。

NSNumberなどの一部のCocoaクラスのdescriptionメソッドは、stringValueメソッドを内部的に呼び出します。例えば...

NSNumber *num = [NSNumber numberWithFloat:0.2f];
NSString *description1 = num.stringValue;
NSString *description2 = [num description];

NSLog("%@", description1);
NSLog("%@", description2);

...同じ出力があります:

Printing description of description1:
0.2
Printing description of description2:
0.2
于 2012-08-20T17:19:35.170 に答える
0

私は見栄えがするのが好きです。Xcodeが改行を削除することもあれば、削除しないこともあるので、YMMV:

- (NSString *)description   // also used for comparison purposes
{
    NSMutableString *str = [NSMutableString stringWithCapacity:256];
#ifndef NDEBUG // so in Distribution build, this does not get included
    [str appendFormat:@"Address ID=\"%@\"\n", [self.privateDict objectForKey:kID]];
    [str appendFormat:@"  usrID:      %@\n", [self.privateDict objectForKey:kADuserID]];
    [str appendFormat:@"  first:      %@\n", [self.privateDict objectForKey:kADfirstName]];
    [str appendFormat:@"  last:       %@\n", [self.privateDict objectForKey:kADlastName]];
    [str appendFormat:@"  address:    %@\n", [self.privateDict objectForKey:kADaddress]];
    [str appendFormat:@"  suite:      %@\n", [self.privateDict objectForKey:kADsuiteApt]];
    [str appendFormat:@"  city:       %@\n", [self.privateDict objectForKey:kADcity]];
    [str appendFormat:@"  state:      %@\n", [self.privateDict objectForKey:kADstate]];
    [str appendFormat:@"  zip:        %@\n", [self.privateDict objectForKey:kADzipCode]];
    [str appendFormat:@"  phone:      %@\n", [self.privateDict objectForKey:kADphone]];
#endif
    return str;
}
于 2012-08-20T17:49:26.757 に答える