如何删除NSArray内的NSString的前导&尾随空白?

我有一个NSArray声明如下:

@property (nonatomic, strong) NSArray *arrayRefineSubjectCode; 

我手动填写数组元素如下:

  arrayRefineSubjectCode = [NSArray arrayWithObjects: @" BKKC 2061", @" BKKS 2631 ", @"BKKS 2381 ", nil]; 

那么如何删除开始和结束的空白,并使每个数组元素变成如下所示:

  arrayRefineSubjectCode = [NSArray arrayWithObjects: @"BKKC 2061", @"BKKS 2631", @"BKKS 2381", nil]; 

我曾尝试使用“stringByTrimmingCharactersInSet:”,但它只适用于NSString。 有点困惑在这里。 请帮忙…

NSArray和包含的NSString对象都是不可变的。 没有办法改变你拥有的物体。

相反,你必须创build新的string,并把它们放在一个新的数组中:

 NSMutableArray *trimmedStrings = [NSMutableArray array]; for (NSString *string in arrayRefineSubjectCode) { NSString *trimmedString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; [trimmedStrings addObject:trimmedString]; } arrayRefineSubjectCode = trimmedStrings; 

阅读http://nshipster.com/nscharacterset/

NSString -stringByTrimmingCharactersInSet:是一个你应该知道的方法。 它通常通过NSCharacterSet + whitespaceCharacterSet或+ whitespaceAndNewlineCharacterSet来移除stringinput的开头和结尾的空格。

所以,在Swift 3中

 let _ = " ABC ".trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) // ABC 

SSToolkit有这样几个很好的类别 :编辑:链接被打破,它似乎不再是在SSToolkit了 。

这是旧的代码:

 - (NSString *)stringByTrimmingLeadingAndTrailingCharactersInSet:(NSCharacterSet *)characterSet { return [[self stringByTrimmingLeadingCharactersInSet:characterSet] stringByTrimmingTrailingCharactersInSet:characterSet]; } - (NSString *)stringByTrimmingLeadingAndTrailingWhitespaceAndNewlineCharacters { return [[self stringByTrimmingLeadingWhitespaceAndNewlineCharacters] stringByTrimmingTrailingWhitespaceAndNewlineCharacters]; } - (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfFirstWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]]; if (rangeOfFirstWantedCharacter.location == NSNotFound) { return @""; } return [self substringFromIndex:rangeOfFirstWantedCharacter.location]; } - (NSString *)stringByTrimmingLeadingWhitespaceAndNewlineCharacters { return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } - (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet] options:NSBackwardsSearch]; if (rangeOfLastWantedCharacter.location == NSNotFound) { return @""; } return [self substringToIndex:rangeOfLastWantedCharacter.location + 1]; // Non-inclusive } - (NSString *)stringByTrimmingTrailingWhitespaceAndNewlineCharacters { return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } 

然而,不要用不同的字符集剥离几次,最好创build一个你想要删除的所有字符集的联合。 NSMutableCharacterSet是你的朋友。

从“string”中删除前导空格和尾随空格

 - (NSString*)stringByRemovingLeadingAndTrailingWhiteSpaces:(NSString*)string { NSArray * components = [string componentsSeparatedByString:@" "]; if([components count] == 1) { return string; } NSUInteger originalLength = [string length]; unichar buffer[originalLength+1]; [string getCharacters:buffer range:NSMakeRange(0, originalLength)]; NSMutableString * newStringNoLeadingSpace = [NSMutableString string]; BOOL goToStripTrailing = NO; for(int i = 0; i < originalLength; i++) { NSLog(@"%C", buffer[i]); NSString * newCharString = [NSString stringWithFormat:@"%c", buffer[i]]; if(goToStripTrailing == NO && [newCharString isEqualToString:@" "]) continue; goToStripTrailing = YES; [newStringNoLeadingSpace appendString:newCharString]; } NSUInteger newLength = [newStringNoLeadingSpace length]; NSMutableString * newString = [NSMutableString string]; unichar bufferSecondPass[newLength+1]; [newStringNoLeadingSpace getCharacters:bufferSecondPass range:NSMakeRange(0, newLength)]; int locationOfLastCharacter = (int)newLength; for(int i = (int)newLength - 1; i >= 0; i--) { NSLog(@"%C", bufferSecondPass[i]); NSString * newCharString = [NSString stringWithFormat:@"%c", bufferSecondPass[i]]; locationOfLastCharacter = i+1; if(![newCharString isEqualToString:@" "]) break; } NSRange range = NSMakeRange(0, locationOfLastCharacter); newString = [[NSString stringWithString:[newStringNoLeadingSpace substringWithRange:range]] copy]; return newString; } 

尼古拉是正确的可变性。 所以解决问题的最简单方法就是定义

 @property (nonatomic, strong) NSMutableArray *arrayRefineSubjectCode; 

然后逐个插入string,例如

 for ( int counter = 0 ; counter < 3 ; counter++ ) { NSMutableString *s = [NSMutableString stringWithFormat:@" blah "]; [arrayRefineSubjectCode addObject:s]; } 

得到三个“嗒嗒”的元素。 请注意,您不能将对象添加到不可变的NSArray,只能添加到可变的NSMutableArray。

当然,你可能已经在某处已经有了多余的空间。 你将不得不做一个可变的(!)这些string的副本,并添加到arrayRefineSubjectCode数组与addObject。 在将数组添加到数组之前或之后,您可以删除这些空格。

希望有点帮助。

只是想添加最后一句话。 你可能想知道为什么你会使用不可变的对象。 有几个原因,但是如果你可以逃避不可改变的代码,复制很容易(只需将指针复制到保存数据的地址,因为数据不会改变),它是更可能是线程安全的。 当然,要小心,然后用NSArray指向像NSMutableString这样的可变对象。

  NSString *newString = [someString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];