It may not be the most efficient, but it is a simple solution for making an array of objects that have string representations and turn them into a comma-separated list, for example, 1, 2, 3, and 4.
@implementation NSArray (MyCollection) - (NSString *)stringCommaAndSeparated { return [self stringCommaAndSeparatedUsingStringConverter:^NSString *(id object) { assert( [object isKindOfClass:NSString.class] ); return (NSString *)object; }]; } - (NSString *)stringCommaAndSeparatedUsingStringConverter:(NSString *(^)(id object))stringConverter { assert( stringConverter ); if( self.count == 0 ) return @""; if( self.count == 1 ) return stringConverter(self.firstObject); if( self.count == 2 ) return [NSString stringWithFormat:NSLocalizedString(@"%@ and %@", nil), stringConverter(self[0]), stringConverter(self[1]) ]; NSMutableString *string = [[NSMutableString alloc] init]; for( int index = 0; index < self.count-1; index += 1 ) [string appendFormat:NSLocalizedString(@"%@, ", nil), stringConverter(self[index])]; [string appendFormat:NSLocalizedString(@"and %@", nil), stringConverter(self.lastObject)]; return string;
Here is an example of this in action:
// Results in @"1, 2, 3, and 4" NSString *str = [@[@"1", @"2", @"3", @"4"] stringCommaAndSeparated]; // Results in @"1, 2, 3, and 4" NSString *str2 = [@[@(1), @(2), @(3), @(4)] stringCommaAndSeparatedUsingStringConverter:^NSString *(id object) { assert( [object isKindOfClass:NSNumber.class] ); NSNumber *number = object; return number.stringValue; }];
source share