提问



Objective-C中是否存在(stringByAppendingString:)字符串连接的快捷方式,或者NSString的常用快捷方式?


例如,我想做:


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


更像是:


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

最佳参考


我能想到的两个答案......既不像只有一个连接运算符那么特别令人愉快。


首先,使用NSMutableString,它有一个appendString方法,消除了对额外临时字符串的一些需要。


其次,使用NSArray通过componentsJoinedByString方法连接。

其它参考1


一个选项:



[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;
}

其它参考2


如果您有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


请享用。

其它参考3


我一直回到这篇文章,并总是最终对答案进行排序,找到这个简单的解决方案,根据需要使用尽可能多的变量:


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


例如:


NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];

其它参考4


好吧,因为冒号是一种特殊符号,但是方法签名的一部分,可以通过类别NSString来添加此非惯用字符串连接样式:


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


你可以定义尽可能多的冒号分隔的参数...... ;-)


为了更好的衡量,我还添加了concat:带有nil终止字符串列表的变量参数。


//  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);
}

其它参考5


创造一种方法......


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


然后,在您需要它的任何函数中,将您的字符串或textfield或其他任何内容设置为此函数的返回值。


或者你可以做什么来制作一个快捷方式是将NSString转换为c ++字符串并在那里使用+。


希望这可以帮助!!!!!

其它参考6


使用这种方式:


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."];

其它参考7


宏:


// 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:@""];

其它参考8


在构建Web服务请求时,我发现执行类似以下操作非常简单,并且可以在Xcode中进行连接:


NSString* postBody = {
    @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    @"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
    @" <soap:Body>"
    @"  <WebServiceMethod xmlns=\"\">"
    @"   <parameter>test</parameter>"
    @"  </WebServiceMethod>"
    @" </soap:Body>"
    @"</soap:Envelope>"
};

其它参考9


创建AppendString(AS)宏的快捷方式......



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


注意:


如果使用宏,当然只需使用可变参数,请参阅EthanB的回答。

其它参考10


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];

其它参考11


这是一个简单的方法,使用新的数组文字语法:


NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^

其它参考12


使c = [a stringByAppendingString: b]更短的唯一方法是在st点附近使用自动完成。 +运算符是C的一部分,它不了解Objective-C对象。

其它参考13


如何缩短stringByAppendingString并使用 #define :


#define and stringByAppendingString


因此你会使用:


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


问题是它只适用于两个字符串,你需要包含额外的括号以获得更多的附加信息:


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

其它参考14


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


使用Objective C几年后,我认为这是使用Objective C实现您想要实现的目标的最佳方式。


在Xcode应用程序中开始键入N,它自动完成NSString。
键入str并自动填充stringByAppendingString。因此击键非常有限。


一旦你掌握了点击@键并且标记编写可读代码的过程不再成为问题。这只是一个适应的问题。

其它参考15


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];

其它参考16


NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];

其它参考17


我试过这段代码。它对我有用。


NSMutableString * myString=[**NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];

其它参考18


正在lldb窗格中尝试以下操作


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


哪个错误。


而是使用alloc和initWithFormat方法:


[**NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];

其它参考19


这是为了更好的日志记录和仅记录 - 基于dicius优秀的多参数方法。我定义了一个Logger类,并像这样调用它:


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


几乎不错,除了必须以nil结束var args但我想在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 


为了只有 concat 字符串,我在NSString上定义一个Category并为它添加一个静态(+)连接方法,它看起来与上面的log方法完全相同,只是它返回字符串。它是在NSString上,因为它是一个字符串方法,它是静态的,因为你想从1-N字符串创建一个新的字符串,而不是在附加的任何一个字符串上调用它。

其它参考20


NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];

其它参考21


尝试stringWithFormat:


NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];

其它参考22


经常处理字符串时,我发现创建源文件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()];

其它参考23


我首选的方法是:


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:@""];

其它参考24


您可以使用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];

其它参考25


我测试时,这些格式中的任何一种都适用于XCode7:


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

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


出于某种原因,您只需要混合的第一个字符串上的@运算符字符。


但是,它不适用于变量插入。为此,除了在cat而不是and上使用宏之外,你可以使用这个非常简单的解决方案。

其它参考26


listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];

其它参考27


让我们想象一下,你不知道那里有多少串。


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:@", "];

其它参考28


对于在UI测试中需要这个的所有Objective C爱好者:


-(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];
}

其它参考29


Swift


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"