2012-05-19 3 views
3

Я пытаюсь объединить несколько NSStrings, но хотел бы исключить те, которые являются нулями. Я использую это решение:concatenate nsstring и исключая нули

[NSString stringWithFormat:@"%@/%@/%@", three, two, one]; 

но что, если одна из строк равна нулю? Я бы хотел это исключить. есть идеи?

спасибо.

ответ

7

Вы можете сделать:

[NSString stringWithFormat:@"%@/%@/%@", three ?: @"", two ?: @"", one ?: @""]; 

Или лучше, вероятно, будет иметь изменяемую строку и построить его:

NSMutableString *string = [[NSMutableString alloc] initWithCapacity:0]; 
if (three) { 
    [string appendFormat:@"%@/", three]; 
} 
if (two) { 
    [string appendFormat:@"%@/", two]; 
} 
if (one) { 
    [string appendFormat:@"%@/", one]; 
} 
3

Вы могли бы просто иметь метод, как

- (NSString *)stringOrEmptyString:(NSString *)string 
{ 
    if (string) 
     return string; 
    else 
     return @""; 
} 

, а затем просто

[NSString stringWithFormat:@"%@/%@/%@", 
    [self stringOrEmptyString:three], 
    [self stringOrEmptyString:two], 
    [self stringOrEmptyString:one]]; 

Update:

В качестве альтернативы, если вы не хотите иметь косую черту, если были пустые значения, то в качестве альтернативы может сделать что-то вроде:

NSMutableArray *array = [[NSMutableArray alloc] init]; 

if (one) 
    [array addObject:one]; 
if (two) 
    [array addObject:two]; 
if (three) 
    [array addObject:three]; 

Тогда вы могли бы получить NSString в результате что-то вроде:

[array componentsJoinedByString:@"/"] 

И, конечно же, если вы находитесь в мире не-ARC, вы хотите окончательный [array release].

1

Вы можете сделать цикл и проверить каждый объект.

NSString *myString = [[NSString alloc] init]; 
NSArray *myObjects = [[NSArray alloc] initWithObjects:three,two,one,nil]; 
for(NSString *currentObject in myObjects) { 
    if(![currentObject isEqualToString:@""]) myString = [NSString stringWithFormat:@"%@/%@",myString,currentObject]; 
} 
+0

Итак, вы предполагаете, что ни один, ни два, ни три не равны нулю, а скорее всего, что это все строки, возможно, строка с нулевой длиной. Если это проблема, которую он пытается решить, тогда это здорово. Но я предположил, что, когда moshikafya сказал, что «строка является нулевой», он имел в виду, что переменная будет равна нулю, и в этом случае это не сработает. – Rob

+0

Если вы хотите, чтобы он проверял значение null вместо пустой строки, просто замените «!» [CurrentObject isEqualToString: @ ""] "на" currentObject! = Nil "или" currentObject ". –

+1

Да, но тогда ноль initWithObjects - переработанный список не будет работать. Например. если 'two' был равен нулю,' one' никогда не будет добавлен в массив. Но мне нравится ваше мышление о массивах, поэтому я обновил свой ответ с помощью другого возможного решения. – Rob

Смежные вопросы