Ярлыки в Objective-C для объединения строк NSS - PullRequest
1090 голосов
/ 04 февраля 2009

Есть ли какие-либо ярлыки для (stringByAppendingString:) конкатенации строк в Objective-C или ярлыки для работы с NSString в целом?

Например, я хотел бы сделать:

NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

что-то вроде:

string myString = "This";
string test = myString + " is just a test";

Ответы [ 30 ]

4 голосов
/ 23 марта 2011

Это для лучшей регистрации и только регистрации - на основе отличного метода множественных аргументов dicius. Я определяю класс Logger и называю его так:

[Logger log: @"foobar ", @" asdads ", theString, nil];

Почти хорошо, за исключением необходимости заканчивать аргументы var "nil", но я полагаю, что в Objective-C этого нет.

logger.h

@interface Logger : NSObject {
}
+ (void) log: (id) first, ...;
@end

Logger.m

@implementation Logger

+ (void) log: (id) first, ...
{
    // TODO: make efficient; handle arguments other than strings
    // thanks to @diciu /483518/yarlyki-v-objective-c-dlya-obedineniya-strok-nss
    NSString * result = @"";
    id eachArg;
    va_list alist;
    if(first)
    {
        result = [result stringByAppendingString:first];
        va_start(alist, first);
        while (eachArg = va_arg(alist, id)) 
        {
            result = [result stringByAppendingString:eachArg];
        }
        va_end(alist);
    }
    NSLog(@"%@", result);
}

@end 

Чтобы получить только строки concat , я бы определил категорию для NSString и добавил к ней статический (+) метод конкатенации, который выглядит точно так же, как метод log выше, за исключением того, что он возвращает строку. Он находится на NSString, потому что это строковый метод, и он статический, потому что вы хотите создать новую строку из 1-N строк, а не вызывать ее ни для одной из строк, являющихся частью добавления.

3 голосов
/ 03 мая 2013

Мой предпочтительный метод такой:

NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";

NSString *joinedString = [@[firstString, secondString, thirdString] join];

Этого можно добиться, добавив метод соединения к NSArray с категорией:

#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
    return [self componentsJoinedByString:@""];
}
@end

@[] это краткое определение для NSArray, я думаю, что это самый быстрый способ объединения строк.

Если вы не хотите использовать категорию, используйте непосредственно метод componentsJoinedByString::

NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];
3 голосов
/ 05 апреля 2013

Вы можете использовать NSArray как

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil];

NSString *fullLengthString = [myStrings componentsJoinedByString:@" "];

или

вы можете использовать

NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];
3 голосов
/ 14 ноября 2012

При работе со строками часто мне проще создать исходный файл ObjC ++, затем я могу объединить std :: strings вторым методом, показанным в вопросе.

std::string stdstr = [nsstr UTF8String];

//easier to read and more portable string manipulation goes here...

NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];
3 голосов
/ 11 ноября 2012

Попробуйте строку с форматом:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
1 голос
/ 07 июня 2016

Для всех любителей Objective C, которые нуждаются в этом в UI-Test:

-(void) clearTextField:(XCUIElement*) textField{

    NSString* currentInput = (NSString*) textField.value;
    NSMutableString* deleteString = [NSMutableString new];

    for(int i = 0; i < currentInput.length; ++i) {
        [deleteString appendString: [NSString stringWithFormat:@"%c", 8]];
    }
    [textField typeText:deleteString];
}
1 голос
/ 28 января 2016

Любой из этих форматов работает в XCode7, когда я тестировал:

NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
  @"This"
  " and that"
  " and one more"
};

NSLog(@"\n%@\n\n%@",sTest1,sTest2);

По какой-то причине вам нужен только символ оператора @ в первой строке микса.

Однако, это не работает с вставкой переменной. Для этого вы можете использовать это чрезвычайно простое решение за исключением использования макроса для "cat" вместо "и".

0 голосов
/ 27 мая 2016

Давайте представим, что вы не знаете, сколько там строк.

NSMutableArray *arrForStrings = [[NSMutableArray alloc] init];
for (int i=0; i<[allMyStrings count]; i++) {
    NSString *str = [allMyStrings objectAtIndex:i];
    [arrForStrings addObject:str];
}
NSString *readyString = [[arrForStrings mutableCopy] componentsJoinedByString:@", "];
0 голосов
/ 03 марта 2016

В Свифт

let str1 = "This"
let str2 = "is just a test"

var appendStr1 = "\(str1) \(str2)" // appendStr1 would be "This is just a test"
var appendStr2 = str1 + str2 // // appendStr2 would be "This is just a test"

Кроме того, вы можете использовать += оператор для того же, что и ниже ...

var str3 = "Some String" 
str3 += str2            // str3 would be "Some String is just a test"
0 голосов
/ 22 января 2013
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
...