Ярлыки в Objective-C для объединения строк NSS

Существуют ли какие-либо сочетания клавиш для (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";
вопрос задан 4.02.2009
typeoneerror
32395 репутация

30 ответов


  • 1070 рейтинг

    Опция:

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

    Другой вариант:

    Я предполагаю, что вы не довольны несколькими добавлениями (a + b + c + d), в этом случае вы можете сделать:

    NSLog(@"%@", [Util append:one, @" ", two, nil]); // "one two"
    NSLog(@"%@", [Util append:three, @"/", two, @"/", one, nil]); // three/two/one
    

    используя что-то вроде

    + (NSString *) append:(id) first, ...
    {
        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);
        }
        return result;
    }
    
    ответ дан diciu, с репутацией 26336, 4.02.2009
  • 584 рейтинг

    Два ответа я могу придумать. , , ни один из них не так приятен, как просто оператор конкатенации.

    Во-первых, используйте NSMutableString, который имеет метод appendString, устраняя некоторые из необходимости дополнительных временных строк.

    Во-вторых, используйте NSArray для объединения через метод componentsJoinedByString.

    ответ дан Chris Blackwell, с репутацией 8171, 4.02.2009
  • 140 рейтинг

    Если у вас есть 2 литерала NSString , вы также можете просто сделать это:

    NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";
    

    Это также полезно для присоединения #defines:

    #define STRINGA @"Also, I don't know "
    #define STRINGB @"where food comes from."
    #define JOINED STRINGA STRINGB
    

    Наслаждайтесь.

    ответ дан Johannes Fahrenkrug, с репутацией 30267, 17.03.2011
  • 67 рейтинг

    Я продолжаю возвращаться к этому посту и всегда заканчиваю сортировать ответы, чтобы найти это простое решение, которое работает с таким количеством переменных, сколько необходимо:

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

    Например:

    NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
    
    ответ дан Kyle Clegg, с репутацией 28249, 11.08.2012
  • 43 рейтинг

    Ну, так как двоеточие является своего рода специальным символом, но является частью сигнатуры метода, можно добавить NSString с категорией, чтобы добавить этот неидиоматический стиль объединения строк 170146280 типа :

    [@"This " : @"feels " : @"almost like " : @"concatenation with operators"];
    

    Вы можете определить столько аргументов, разделенных двоеточиями, сколько считаете полезным. , , ;-)

    Для хорошей меры я также добавил concat: с переменными аргументами, который принимает nil завершенный список строк.

    //  NSString+Concatenation.h
    
    #import 
    
    @interface NSString (Concatenation)
    
    - (NSString *):(NSString *)a;
    - (NSString *):(NSString *)a :(NSString *)b;
    - (NSString *):(NSString *)a :(NSString *)b :(NSString *)c;
    - (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d;
    
    - (NSString *)concat:(NSString *)strings, ...;
    
    @end
    
    //  NSString+Concatenation.m
    
    #import "NSString+Concatenation.h"
    
    @implementation NSString (Concatenation)
    
    - (NSString *):(NSString *)a { return [self stringByAppendingString:a];}
    - (NSString *):(NSString *)a :(NSString *)b { return [[self:a]:b];}
    - (NSString *):(NSString *)a :(NSString *)b :(NSString *)c
        { return [[[self:a]:b]:c]; }
    - (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d
        { return [[[[self:a]:b]:c]:d];}
    
    - (NSString *)concat:(NSString *)strings, ...
    {
        va_list args;
        va_start(args, strings);
    
        NSString *s;    
        NSString *con = [self stringByAppendingString:strings];
    
        while((s = va_arg(args, NSString *))) 
            con = [con stringByAppendingString:s];
    
        va_end(args);
        return con;
    }
    @end
    
    //  NSString+ConcatenationTest.h
    
    #import 
    #import "NSString+Concatenation.h"
    
    @interface NSString_ConcatenationTest : SenTestCase
    
    @end
    
    //  NSString+ConcatenationTest.m
    
    #import "NSString+ConcatenationTest.h"
    
    @implementation NSString_ConcatenationTest
    
    - (void)testSimpleConcatenation 
    {
        STAssertEqualObjects([@"a":@"b"], @"ab", nil);
        STAssertEqualObjects([@"a":@"b":@"c"], @"abc", nil);
        STAssertEqualObjects([@"a":@"b":@"c":@"d"], @"abcd", nil);
        STAssertEqualObjects([@"a":@"b":@"c":@"d":@"e"], @"abcde", nil);
        STAssertEqualObjects([@"this " : @"is " : @"string " : @"concatenation"],
         @"this is string concatenation", nil);
    }
    
    - (void)testVarArgConcatenation 
    {
        NSString *concatenation = [@"a" concat:@"b", nil];
        STAssertEqualObjects(concatenation, @"ab", nil);
    
        concatenation = [concatenation concat:@"c", @"d", concatenation, nil];
        STAssertEqualObjects(concatenation, @"abcdab", nil);
    }
    
    ответ дан Palimondo, с репутацией 4883, 16.03.2012
  • 35 рейтинг

    создать метод. , , , , ,

    - (NSString *)strCat: (NSString *)one: (NSString *)two
    {
        NSString *myString;
        myString = [NSString stringWithFormat:@"%@%@", one , two];
        return myString;
    }
    

    Затем, в любой функции, в которой вы нуждаетесь, установите строку или textfield или что-либо еще в возвращаемое значение этой функции.

    Или, что вы можете сделать, чтобы сделать ярлык, это преобразовать строку NSString в строку c ++ и использовать там «+».

    Надеюсь, это поможет! ! ! ! !

    ответ дан Sidd Menon, с репутацией 573, 3.10.2011
  • 32 рейтинг

    Используйте этот способ:

    NSString *string1, *string2, *result;
    
    string1 = @"This is ";
    string2 = @"my string.";
    
    result = [result stringByAppendingString:string1];
    result = [result stringByAppendingString:string2];
    

    ИЛИ

    result = [result stringByAppendingString:@"This is "];
    result = [result stringByAppendingString:@"my string."];
    
    ответ дан Taimur Ajmal, с репутацией 1638, 26.07.2010
  • 29 рейтинг

    Макрос:

    // stringConcat(...)
    //     A shortcut for concatenating strings (or objects' string representations).
    //     Input: Any number of non-nil NSObjects.
    //     Output: All arguments concatenated together into a single NSString.
    
    #define stringConcat(...) \
        [@[__VA_ARGS__] componentsJoinedByString:@""]
    

    Тестовые случаи:

    - (void)testStringConcat {
        NSString *actual;
    
        actual = stringConcat(); //might not make sense, but it's still a valid expression.
        STAssertEqualObjects(@"", actual, @"stringConcat");
    
        actual = stringConcat(@"A");
        STAssertEqualObjects(@"A", actual, @"stringConcat");
    
        actual = stringConcat(@"A", @"B");
        STAssertEqualObjects(@"AB", actual, @"stringConcat");
    
        actual = stringConcat(@"A", @"B", @"C");
        STAssertEqualObjects(@"ABC", actual, @"stringConcat");
    
        // works on all NSObjects (not just strings):
        actual = stringConcat(@1, @" ", @2, @" ", @3);
        STAssertEqualObjects(@"1 2 3", actual, @"stringConcat");
    }
    

    Альтернативный макрос: (если вы хотите применить минимальное количество аргументов)

    // stringConcat(...)
    //     A shortcut for concatenating strings (or objects' string representations).
    //     Input: Two or more non-nil NSObjects.
    //     Output: All arguments concatenated together into a single NSString.
    
    #define stringConcat(str1, str2, ...) \
        [@[ str1, str2, ##__VA_ARGS__] componentsJoinedByString:@""];
    
    ответ дан EthanB, с репутацией 3409, 31.05.2013
  • 27 рейтинг

    При создании запросов для веб-служб, я считаю, что сделать что-то вроде следующего очень легко и делает сцепление читаемым в XCode:

    NSString* postBody = {
        @""
        @""
        @" "
        @"  "
        @"   test"
        @"  "
        @" "
        @""
    };
    
    ответ дан FreeAsInBeer, с репутацией 12109, 16.03.2012
  • 25 рейтинг

    Ярлык путем создания макроса AppendString (AS). , ,

    #define AS(A,B)    [(A) stringByAppendingString:(B)]
    NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");

    Примечание:

    Если вы используете макрос, конечно, просто делайте это с переменными аргументами, смотрите ответ EthanB.

    ответ дан does_not_exist, с репутацией , 18.07.2009
  • 13 рейтинг
    NSString *label1 = @"Process Name: ";
    NSString *label2 = @"Process Id: ";
    NSString *processName = [[NSProcessInfo processInfo] processName];
    NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
    NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];
    
    ответ дан coder284, с репутацией 591, 10.06.2010
  • 10 рейтинг

    Вот простой способ, используя новый синтаксис литерала массива:

    NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                      ^^^^^^^ create array ^^^^^
                                                   ^^^^^^^ concatenate ^^^^^
    
    ответ дан justin, с репутацией 96103, 30.08.2012
  • 8 рейтинг
    NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
    
    ответ дан Gobi M, с репутацией 1800, 29.04.2013
  • 8 рейтинг
    NSString *myString = @"This";
    NSString *test = [myString stringByAppendingString:@" is just a test"];
    

    Спустя пару лет работы с Целью C, я думаю, что это лучший способ работы с Целью C для достижения того, чего вы пытаетесь достичь.

    Начните вводить «N» в вашем приложении XCode, и оно автоматически заполняется до «NSString». введите "str", и он автоматически завершится до "stringByAppendingString". Таким образом, нажатия клавиш довольно ограничены.

    Как только вы научитесь нажимать клавишу «@» и вкладывать процесс написания читаемого кода, проблема больше не станет. Это просто вопрос адаптации.

    ответ дан Ian Clay, с репутацией 372, 1.08.2013
  • 8 рейтинг

    Как насчет сокращения stringByAppendingString и использования #define :

    #define and stringByAppendingString
    

    Таким образом вы будете использовать:

    NSString* myString = [@"Hello " and @"world"];
    

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

    NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
    
    ответ дан Sunday Ironfoot, с репутацией 9241, 3.07.2012
  • 8 рейтинг

    Единственный способ сделать c = [a stringByAppendingString: b] короче - это использовать автозаполнение около точки st. Оператор + является частью C, которая не знает об объектах Objective-C.

    ответ дан does_not_exist, с репутацией , 4.02.2009
  • 7 рейтинг
    NSString *label1 = @"Process Name: ";
    NSString *label2 = @"Process Id: ";
    NSString *processName = [[NSProcessInfo processInfo] processName];
    NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
    NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];
    
    ответ дан does_not_exist, с репутацией , 20.06.2009
  • 6 рейтинг

    Я попробовал этот код. это сработало для меня.

    NSMutableString * myString=[[NSMutableString alloc]init];
    myString=[myString stringByAppendingString:@"first value"];
    myString=[myString stringByAppendingString:@"second string"];
    
    ответ дан Erhan Demirci, с репутацией 3063, 11.05.2013
  • 6 рейтинг

    Пробовал следующее в панели lldb

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

    какие ошибки.

    вместо этого используйте alloc и метод initWithFormat:

    [[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
    
    ответ дан Anthony De Souza, с репутацией 266, 7.04.2014
  • 4 рейтинг

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

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

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

    Logger. ч

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

    Logger. м

    @implementation Logger
    
    + (void) log: (id) first, ...
    {
        // TODO: make efficient; handle arguments other than strings
        // thanks to @diciu http://stackoverflow.com/questions/510269/how-do-i-concatenate-strings-in-objective-c
        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 
    

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

    ответ дан n13, с репутацией 5197, 23.03.2011
  • 4 рейтинг
    NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
    NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
    NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
    
    ответ дан Avinash Mishra, с репутацией 533, 20.01.2016
  • 3 рейтинг

    Мой предпочтительный метод заключается в следующем:

    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:@""];
    
    ответ дан LombaX, с репутацией 14673, 3.05.2013
  • 3 рейтинг

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

    NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
    
    ответ дан CommanderHK, с репутацией 928, 11.11.2012
  • 3 рейтинг

    При работе со строками часто мне проще создать исходный файл 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()];
    
    ответ дан iforce2d, с репутацией 7014, 14.11.2012
  • 3 рейтинг

    Вы можете использовать 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];
    
    ответ дан Arun, с репутацией 440, 5.04.2013
  • 1 рейтинг

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

    NSString *sTest1 = {@"This" " and that" " and one more"};
    NSString *sTest2 = {
      @"This"
      " and that"
      " and one more"
    };
    
    NSLog(@"\n%@\n\n%@",sTest1,sTest2);
    

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

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

    ответ дан Volomike, с репутацией 13336, 28.01.2016
  • 1 рейтинг

    Для всех любителей 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];
    }
    
    ответ дан netshark1000, с репутацией 3393, 7.06.2016
  • 0 рейтинг
    listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
    
    ответ дан J. Chang, с репутацией 13850, 22.01.2013
  • 0 рейтинг

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

    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:@", "];
    
    ответ дан Resty, с репутацией 113, 27.05.2016
  • -1 рейтинг

    В Свифт

    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"
    
    ответ дан Suryakant, с репутацией 2324, 3.03.2016