我想创建一个用于修剪字符串的宏。
我使用下面的代码进行修剪:
[[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]
但如果我创建如下宏,我会收到错误:期望表达式
#define TRIM_STRING(string) ([[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]])
如何正确创建相同的定义宏?
答案 0 :(得分: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]
更整洁,更符合Cocoa。
答案 1 :(得分:2)
摆脱你的开始和结束括号。你有一对太多了。
然后摆脱“NSString stringWithString:string
”并将其替换为string
。这本身就是错误的,因为你没有用括号括起来,但这是学术上的;无论如何你都不需要复制字符串。
修改强>
这是一个好主意,因为您的宏的参数在括号中,无论它出现在宏中的哪个位置都放在括号中。这可以避免问题(如果您将复杂表达式指定为参数),因为预处理器会扩展您的宏。