特别是在Objective-C中的最后一项之前用"和"创建一个以逗号分隔的列表

Ben*_*ero 0 arrays string cocoa objective-c human-readable

我想编写一个方法,提供一个人类可读的数组字符串表示,必要时包含逗号空格(包括牛津逗号),最后连接"和".

例如,假设我有这些数组:

NSArray *nun = @[];
NSArray *won = @[@"The Loneliest"];
NSArray *too = @[@"Peas", @"Pod"];
NSArray *tree = @[@"Apple", @"Falls", @"Far, Far Away"];
Run Code Online (Sandbox Code Playgroud)

我想写一个方法,如:

+ (NSString*) humanReadableListFromArray: (NSArray*) arr
{
  // magic
}
Run Code Online (Sandbox Code Playgroud)

当我通过我的数组时,我希望它们看起来像这样:

@""
@"The Loneliest"
@"Peas and Pod"
@"Apple, Falls, and Far, Far Away"
Run Code Online (Sandbox Code Playgroud)

请注意,第一个只有1个项目,只是没有装饰的第一个项目.第二个,正好有两个项目,没有逗号,但确实有连接"和".第三项,包含两个以上的项目,每个项目之间包含一个逗号空间,最后一项包括and在逗号空间之后和项目之前的附加项目.

在Objective C中有一个简短的方法吗?我已经用Java等语言完成了这项工作,但我知道Objective C这样的方法-(NSString*)[NSArray componentsJoinedByString:]可能有助于实现这一点.


使用"和"替换字符串中的最后一个逗号无法解答此问题.(Objective-C)因为它没有解决最后一个数组项中的逗号.我也研究了像Objective-C这样的问题从对象数组中创建逗号分隔字符串的最简单方法,他们没有提到人类可读性这个很好的部分.

dan*_*anh 6

第三方图书馆@timgcarlson提到听起来很有希望.这是我本地做的......

- (NSString *)humanReadableListFromArray:(NSArray *)array withOxfordStyle:(BOOL)oxford {
    if (array.count == 0) return @"";
    if (array.count == 1) return array[0];
    if (array.count == 2) return [array componentsJoinedByString:@" and "];

    NSArray *firstItems = [array subarrayWithRange:NSMakeRange(0, array.count-1)];
    NSString *lastItem = [array lastObject];
    NSString *lastDelimiter = (oxford)? @", and " : @" and ";
    return [NSString stringWithFormat:@"%@%@%@",
        [firstItems componentsJoinedByString:@", "], lastDelimiter, lastItem];
}
Run Code Online (Sandbox Code Playgroud)