在Objective-C中,将一个NSString列表(NSArray)组合成一个用逗号分隔的NSString,并在列表的最后一项之前使用语法正确的词尾连词",and",最简单、最好的方法是什么?
NSArray *anArray = [NSArray arrayWithObjects:@"milk", @"butter", @"eggs", @"spam", nil];
从这个数组中,我想要NSString @"milk, butter, eggs, and spam"
。
更一般地说,如果列表的长度超过两个项目,我希望除了最后一个和倒数第二个项目(应该有", and "
)之外的每个项目之间都有", "
。如果列表有两项长,我只想要没有逗号的' and '
。如果列表有一项长,我需要数组中的单个字符串。
我喜欢简单的东西:
NSString *newString = [anArray componentsJoinedByString:@", "];
但这当然省略了"one_answers"的连词。
有没有比以下更简单和/或更快的Objective-C方法:
- (NSString *)grammaticallyCorrectStringFromArrayOfStrings:(NSArray *)anArray {
if (anArray == nil) return nil;
int arrayCount = [anArray count];
if (arrayCount == 0) return @"";
if (arrayCount == 1) return [anArray objectAtIndex:0];
if (arrayCount == 2) return [anArray componentsJoinedByString:@" and "];
// arrayCount > 2
NSString *newString = @"";
for (NSString *thisString in anArray) {
if (thisString != [anArray objectAtIndex:0] && thisString != [anArray lastObject]) {
newString = [newString stringByAppendingString:@", "];
}
else if (thisString == [anArray lastObject]) {
newString = [newString stringByAppendingString:@", and "];
}
newString = [newString stringByAppendingString:thisString];
}
return newString;
}
对于循环,我可能会做一些类似的事情
NSMutableString *newString = [NSMutableString string];
NSUInteger lastIndex = arrayCount - 1;
[anArray enumerateObjectsUsingBlock:^(NSString *thisString, NSUInteger idx, BOOL *stop) {
if (idx != 0)
[newString appendString:@","];
if (idx == lastIndex)
[newString appendString:@" and "];
[newString appendString:thisString];
}];
虽然我想这并不是真正的少行。