Shortcuts in Objective-C to concatenate NSStrings

前端 未结 30 2598
伪装坚强ぢ
伪装坚强ぢ 2020-11-22 07:03

Are there any shortcuts to (stringByAppendingString:) string concatenation in Objective-C, or shortcuts for working with NSString in general?

相关标签:
30条回答
  • 2020-11-22 07:41

    Shortcut by creating AppendString (AS) macro ...

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

    Note:

    If using a macro, of course just do it with variadic arguments, see EthanB's answer.

    0 讨论(0)
  • 2020-11-22 07:42

    I tried this code. it's worked for me.

    NSMutableString * myString=[[NSMutableString alloc]init];
    myString=[myString stringByAppendingString:@"first value"];
    myString=[myString stringByAppendingString:@"second string"];
    
    0 讨论(0)
  • 2020-11-22 07:43

    Well, as colon is kind of special symbol, but is part of method signature, it is possible to exted the NSString with category to add this non-idiomatic style of string concatenation:

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

    You can define as many colon separated arguments as you find useful... ;-)

    For a good measure, I've also added concat: with variable arguments that takes nil terminated list of strings.

    //  NSString+Concatenation.h
    
    #import <Foundation/Foundation.h>
    
    @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 <SenTestingKit/SenTestingKit.h>
    #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);
    }
    
    0 讨论(0)
  • 2020-11-22 07:43

    This is for better logging, and logging only - based on dicius excellent multiple argument method. I define a Logger class, and call it like so:

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

    Almost good, except having to end the var args with "nil" but I suppose there's no way around that in 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 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 
    

    In order to only concat strings, I'd define a Category on NSString and add a static (+) concatenate method to it that looks exactly like the log method above except it returns the string. It's on NSString because it's a string method, and it's static because you want to create a new string from 1-N strings, not call it on any one of the strings that are part of the append.

    0 讨论(0)
  • 2020-11-22 07:43
    NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
    NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
    NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
    
    0 讨论(0)
  • 2020-11-22 07:45

    If you have 2 NSString literals, you can also just do this:

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

    That's also useful for joining #defines:

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

    Enjoy.

    0 讨论(0)
提交回复
热议问题