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]

これは、Cocoa との一貫性があり、すっきりしています。

于 2012-04-08T22:38:37.763 に答える
2

開始ブラケットと終了ブラケットを取り除きます。1 ペアが多すぎます。

次に、「」を取り除き、NSString stringWithString:stringに置き換えstringます。かっこで囲まれていないため、これ自体が誤りでしたが、アカデミックです。とにかく、文字列のコピーを作成する必要はありません。

編集:

マクロへの引数はかっこで囲まれているため、マクロ内のどこにでも配置することをお勧めします。これにより、プリプロセッサがマクロを展開する際の問題 (複雑な式を引数として指定した場合) を回避できます。

于 2012-04-08T22:08:53.407 に答える