替换数组显示方法?

时间:2010-01-05 11:10:48

标签: objective-c

我很好奇如何覆盖对象执行以下操作时使用的描述方法(见下文)。我基本上想要更好地格式化输出,但我不确定如何设置它。

NSLog(@"ARRAY: %@", myArray);
非常感谢

EDIT_001

虽然子类化NSArray会起作用,但我决定将一个类别添加到NSArray(之前没有使用过)这是我添加的内容......

// ------------------------------------------------------------------- **
// CATAGORY: NSArray
// ------------------------------------------------------------------- **
@interface NSArray (displayNSArray)
    -(NSString*)display;
@end

@implementation NSArray (displayNSArray)
-(NSString*)display {
    id eachIndex;
    NSMutableString *outString = [[[NSMutableString alloc] init] autorelease];
    [outString appendString:@"("];
    for(eachIndex in self) {
        [outString appendString:[eachIndex description]];
        [outString appendString:@" "];
    }
    [outString insertString:@")" atIndex:[outString length]-1];
    return(outString);
}
@end

加里

3 个答案:

答案 0 :(得分:2)

如果你这么做很多,重新格式化数组显示的最简单方法是在NSArray类中添加一个新的prettyPrint类别。

@interface NSArray ( PrettyPrintNSArray )
- (NSSTring *)prettyPrint;
@end

@implementation NSArray ( PrettyPrintNSArray )
- (NSString *)prettyPrint {
    NSMutableString *outputString = [[NSMutableString alloc] init];
    for( id item in self ) {
        [outputString appendString:[item description]];
    }
    return outputString;
}
@end

显然你需要改变for循环以获得你想要的格式。

答案 1 :(得分:2)

我假设你的myArray变量是NSArray / NSMutableArray类的一个实例。

当NSLog()在其格式字符串中遇到@字符时,它会在对象上调用-description:方法。这是根类NSObject上的一个方法,所有其他Cocoa类都从该方法继承。 -description:返回一个NSString,允许任何实现此方法的对象传递到NSLog(@“@”,anyObject)并具有格式良好的输出。返回的字符串可以是您需要构建的任何内容。

对于您的特定问题,您可以继承NSMutableArray并使用您自己的实现覆盖-description:方法。然后使用您的子类而不是NSMutableArray。

有关NSObject和-description的更多信息:请参阅Apple's docs

答案 2 :(得分:1)

来自Formatting string objects

  

NSString支持为ANSI C functionprintf()定义的格式字符,以及任何对象的“@”。如果对象响应descriptionWithLocale:消息,则NSString发送该消息以检索文本表示,否则,它发送描述消息。

因此要自定义数组到字符串的转换,您应该更改NSArray descriptionWithLocale:implementation。这是example如何在运行时替换对象方法。