连接Objective-C字符串并实现语法正确性的最简单方法(使用'和'连接)

时间:2012-09-13 13:13:33

标签: objective-c string nsstring grammar

Objective-C中最简单,最好的方法是将NSStrings的列表(NSArray)组合成一个用逗号分隔的单个NSString,在列表的最后一项之前使用语法正确的终端连接“,和”? / p>

NSArray *anArray = [NSArray arrayWithObjects:@"milk", @"butter", @"eggs", @"spam", nil];

从这个数组中,我想要NSString @"milk, butter, eggs, and spam"

更一般地说,如果列表长度超过两个项目,我希望除了最后一个和倒数第二个之外的每个项目之间都有", "(应该有", and ")。如果列表长两个项目,我只想要' and '没有逗号。如果列表长度为一个项目,我想要数组中的单个字符串。

我喜欢简单的东西:

NSString *newString = [anArray componentsJoinedByString:@", "];

但这当然会省略'和'结合。

是否有比以下更简单和/或更快的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;
}

1 个答案:

答案 0 :(得分:2)

对于循环,我可能会做类似

的事情
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];
}];

虽然我猜这不是很少。