我想使用-[NSArray componentsJoinedByString]
某些条件,例如:用“,”连接我数组的所有元素,除了最后一个我想要“和”的元素。
它是 python 它会是这样的:
', '.join(array[:-1]) + ' and ' + array[-1]
有没有一种方法或方法可以在一行中做到这一点,避免所有的if else
东西?
我想使用-[NSArray componentsJoinedByString]
某些条件,例如:用“,”连接我数组的所有元素,除了最后一个我想要“和”的元素。
它是 python 它会是这样的:
', '.join(array[:-1]) + ' and ' + array[-1]
有没有一种方法或方法可以在一行中做到这一点,避免所有的if else
东西?
你可以使用subarrayWithRange:
andstringWithFormat:
来做同样的事情。您确实需要至少 1if
来检查数组中的项目数并确保您没有索引异常。
试试这样,我不知道这是否有效,但检查一次,
NSArray *arr= [[NSArray alloc]initWithObjects:@"1",@"2",@"3", nil];
NSString *string = [arr componentsJoinedByString:@","];
NSString *str= [NSString stringWithFormat:@"%@ and %@",[string substringToIndex:[string length]-[[arr lastObject] length]-1],[arr lastObject]];
NSLog(@"%@",str);
它可能不是最有效的,但它是一个很好的简单解决方案,它采用具有字符串表示的对象数组并将它们转换为逗号分隔的列表,例如 1、2、3 和 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; // This is returning a mutable string, but we could copy it to an immutable one!
}
@end
下面是一个例子:
// 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;
}];
这是我的类别解决方案,基于 Wain 的回答:
@implementation NSArray (NSString)
- (NSString *)listStringUsingLocale:(NSLocale *)locale
{
if(!self.count)
return nil;
if(!locale)
locale = [NSLocale currentLocale];
NSString *language = [locale objectForKey: NSLocaleLanguageCode];
if([language isEqualToString:@"en"])
{
if (self.count > 1)
{
NSArray *arr1 = [self subarrayWithRange:NSMakeRange(0, self.count - 1)];
return [NSString stringWithFormat:@"%@ and %@", [arr1 componentsJoinedByString:@", "], self.lastObject];
}
else
{
return self[0];
}
}
return nil;
}
@end
我添加了添加基于语言环境的选项的选项。