2013-07-18 22 views
4

我想在某些條件下使用-[NSArray componentsJoinedByString],例如:將我的數組的所有元素與「,」連接起來,除了最後一個我想要「和」的元素。ios - [NSArray componentsJoinedByString]帶條件

這蟒蛇會是這樣的:

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

有沒有一種方法,或者會做的伎倆在同一行,避免所有的if else東西的方法?

回答

3

您可以使用subarrayWithRange:stringWithFormat:來做同樣的事情。您至少需要1 if來檢查數組中的項目數,並確保您沒有索引異常。

+0

我結束使用嵌套三元運算符,以避免超過'if'的行。這很難閱讀,但np:D。 Thx爲我指出了正確的方向! – Yaman

+0

不錯的一個。我已在下面根據您的解決方案創建了一個類別。 – jowie

2

試試這個樣子,我不知道是該effiecient或沒有,但檢查一次,

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

它可能不是最有效的,但它是一個不錯的簡單解決方案,採取有對象的數組字符串表示,並將其轉化以逗號分隔的列表,諸如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; 
      }]; 
0

這裏是我的類解決方案的基礎上,北斗星的回答是:

@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 

我添加了添加基於區域設置選項的選擇。