4

我想使用-[NSArray componentsJoinedByString]某些条件,例如:用“,”连接我数组的所有元素,除了最后一个我想要“和”的元素。

它是 python 它会是这样的:

', '.join(array[:-1]) + ' and ' + array[-1]

有没有一种方法或方法可以在一行中做到这一点,避免所有的if else东西?

4

4 回答 4

3

你可以使用subarrayWithRange:andstringWithFormat:来做同样的事情。您确实需要至少 1if来检查数组中的项目数并确保您没有索引异常。

于 2013-07-18T10:48:11.553 回答
2

试试这样,我不知道这是否有效,但检查一次,

 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);
于 2013-07-18T10:58:10.610 回答
1

它可能不是最有效的,但它是一个很好的简单解决方案,它采用具有字符串表示的对象数组并将它们转换为逗号分隔的列表,例如 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;
            }];
于 2014-02-02T02:11:20.683 回答
0

这是我的类别解决方案,基于 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

我添加了添加基于语言环境的选项的选项。

于 2015-06-10T15:30:06.600 回答