0

我想创建一个宏来修剪我的字符串。

我使用下面的代码进行修剪:

[[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]

但是,如果我按如下方式创建宏,则会出现错误:预期表达式

#define TRIM_STRING(string) ([[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]])

如何正确创建相同的定义宏?

4

2 回答 2

3

作为一个宏:

#define TRIM_STRING(string) [(string) stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]

但是,这里真的没有理由不使用内联函数。你得到类型检查,编译器会给你一些有意义的错误信息。与内联函数相同:

NSString * NSStringTrim(NSString *string)
{
    return [string stringByTrimmingCharactersInSet:
            [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

或者,更好的是,为此在 NSString 上创建一个类别:

@interface NSString (additions)

- (NSString *)stringByTrimmingWhitespace;

@end

@implementation NSString (additions)

- (NSString *)stringByTrimmingWhitespace
{
    return [self stringByTrimmingCharactersInSet:
            [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

@end

这样你就可以获得命名空间,你可以通过这样做来调用它

[string stringByTrimmingWhitespace]

这更整洁,更符合可可。

于 2012-04-08T22:38:37.763 回答
2

摆脱你的开始和结束括号。你的一对太多了。

然后去掉 " NSString stringWithString:string" 并用string. 这本身就是错误的,因为您没有将它放在括号中,但它是学术性的;无论如何,您都不需要复制字符串。

编辑:

这是一个好主意,因为您对宏的参数在括号中,因此将它放在宏中出现的任何位置的括号中。当预处理器扩展您的宏时,这可以避免问题(如果您指定一个复杂的表达式作为参数)。

于 2012-04-08T22:08:53.407 回答