Objective-C 中连接 NSStrings 的快捷方式

Shortcuts in Objective-C to concatenate NSStrings

提问人:typeoneerror 提问时间:2/4/2009 最后编辑:Forgetypeoneerror 更新时间:12/16/2020 访问量:841767

问:

在 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";
目标 C nsString 字符串连接

评论

5赞 powerj1984 1/16/2013
我只想建议将“@+”作为串联运算符。我希望在 Objective-C 的下一次更新中出现这种情况,kthxbai
49赞 jcsahnwaldt Reinstate Monica 8/15/2013
@NicolasMiari 这并不是 Objective-C 所缺乏的唯一特性。还有几十个其他的。引用 Jordão 发布的链接:“坦率地说,Objective-C 是一种原始语言。将它与任何现代语言进行比较,你很快就会发现它缺乏。我同意。Objective-C(1980 年代初)是 C(1970 年代初),添加了一种非常简单且类型不太安全的 OOP。没关系,但与Java或C#相比,感觉很老套。
6赞 Joren 9/16/2013
@NicolasMiari:解释性语言?C# 和 Java 是编译语言。编译为字节码,然后再次编译为机器码。
4赞 Pradeep 6/12/2014
现在事情发生了变化:Swift(苹果新语言)更简单
7赞 Nicolas Miari 7/18/2014
关于“类型安全”,我认为这是一个风格问题。对于来自 C#/C++ 的人来说,拥有任何类型的异构对象数组可能看起来很奇怪,但对于习惯了 Objective-C/Cocoa 的人来说,这是一种动态和自由的形式;如果您知道自己在做什么,这是一个优势。就像现在年轻程序员抨击的几乎所有关于 C 的东西一样......

答:

631赞 Chris Blackwell 2/4/2009 #1

我能想到的两个答案......两者都不像仅仅拥有串联运算符那样令人愉快。

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

其次,使用 an 通过方法进行连接。NSArraycomponentsJoinedByString

评论

34赞 Eli 12/22/2009
虽然另一个选项有很多赞成票,但我认为如果你在构建时不知道所有的字符串,这是最好的答案。每次附加字符串时,都会产生大量开销。使用可变字符串可以消除该问题。
22赞 Rob Napier 2/16/2010
+1 同意 w @Eli。这些通常是最好的解决方案。NSArray -componentsJoinedByString 可以在一行中很好地完成: string = [[NSArray arrayWithObjects:@“This”, “Is”, “A”, “Test”, nil] componentsJoinedByString:@“ ”];
6赞 Pierre-David Belanger 9/27/2011
+1 这个答案。 比 内存更友好。[NSMutableString appendString][NSString stringByAppendingStrings]
2赞 Amogh Talpallikar 7/2/2013
@RobNapier:现在有了新的数组文字语法,它就更好了。
30赞 candieduniverse 2/22/2014
这种技术似乎是最优雅的。它应该是选定的答案。[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
8赞 user23743 2/4/2009 #2

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

评论

0赞 ReinstateMonica3167040 2/4/2020
你确实意识到你是在暗示他不想做的事情,对吧?至少,可以使用 a 来缩短它。#define
1181赞 diciu 2/4/2009 #3

一个选项:

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

评论

9赞 Rob Napier 2/16/2010
@pablasso同意了。Util 方法非常丑陋。如果你想要这样的东西,它应该作为一个 NSString 类别来完成,其名称类似于 +stringByAppendingStrings:。即使是名称为 NSStringForAppendedStrings(...) 的直接函数也比 Util 等类中的静态方法更好(名称中带有“Util”的任何内容都可能被分解得很差)。该函数还可以更好地使用 NSMutableString 和 -appendString 实现,以避免创建一组不受限制的临时自动释放的 NSStrings。
1赞 George 10/13/2011
对于大字符串,这可能会浪费内存。推荐的东西更像是真实编程语言中的 StringBuilder。然后,您可以在实际开始追加之前弄清楚需要多少内存。可以重构上述方法以执行此操作。但是,最好创建一个 StringBuilder 对象,因为这将使它的用户不必跟踪他们需要组合的所有字符串的列表。
0赞 Gubatron 9/20/2014
如何导入 Util?这个IDE令人沮丧(没有建议“导入一些东西。Util“,就像在 eclipse 上一样,我在任何地方都没有提到”Util”。这是我应该自己编写的类吗?
2赞 gnasher729 4/29/2015
stringWithFormat 不仅非常优雅,而且功能更强大。你可以将它与 @“%@%@” 一起使用来连接两个字符串,@“%@%@%@”来连接三个字符串,但你可以在里面放任何额外的字符,打印数字,如果你愿意,重新排序参数等等。格式字符串可以本地化,使其功能增强十倍。字符串连接适合初学者。
7赞 6/21/2009 #4
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];
27赞 Jim Logan 7/18/2009 #5

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

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

注意:

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

评论

0赞 typeoneerror 7/18/2009
凉!我仍然认为上面的 Util 是一个更优雅的解决方案;你只能用这个宏附加一个字符串,对吧?
1赞 7/19/2009
没错,上面的 AS 宏每行代码执行一个附加。如果多个追加是常见的需求,则可以创建更多宏。例如,用于附加两个字符串的宏:<pre> #define A2S(A,B,C) [[(A) stringByAppendingString:(B)] stringByAppendingString:(C)] </pre>
2赞 7/19/2009
或者,只需使用“#define AS stringByAppendingString”之类的宏缩短所需的键入时间,然后只需使用“AS”,而您通常会键入“stringByAppendingString”,并享受每行代码的多个附加。
15赞 Rob Napier 2/16/2010
这些宏的问题在于它们破坏了 Objective-C 的主要目标之一,即可读性。目前还不清楚“AS”是做什么的。以牺牲可读性为代价来保存一些击键(其中大部分是通过自动完成处理的),这很少是一个好的权衡。也有例外(@“” 语法比每次都必须使用 +stringWithUTF8String: 更具可读性),但目标仍然是可读性,而不仅仅是简洁。你写一次,但你永远调试。
0赞 Fattie 12/18/2015
嗨,罗伯 - 我不能同意你的看法。当然,“AS”是个坏名字。它应该被命名为“CAT”。
13赞 coder284 6/10/2010 #6
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];
40赞 Taimur Ajmal 7/27/2010 #7

使用这种方式:stringByAppendingString:

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

评论

41赞 SilverSideDown 7/24/2012
你确实意识到你是在暗示他不想做的事情,对吧?
156赞 Johannes Fahrenkrug 3/17/2011 #8

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

享受。

评论

13赞 Johannes Fahrenkrug 11/24/2012
@CristiBăluță :)但这仅适用于文本,不适用于动态创建的 NSString 实例。
11赞 Kevin 5/12/2013
实际上,在第一个字符串之后,您不需要字符串上的 s。@@"I" " really" " enjoy"...
0赞 digory doo 7/31/2013
您可能希望将 STRINGA 和 STRINGB 放在括号内,否则在解析宏时可能会得到奇怪的结果。#define 已加入 (STRINGA STRINGB)
0赞 Vagif 6/2/2017
@JohannesFahrenkrug 那为什么这不起作用呢?我遇到错误:(NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";Expected '@' in program
0赞 Johannes Fahrenkrug 6/6/2017
@Vagif如何定义?TABLE_NAME
4赞 n13 3/24/2011 #9

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

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

几乎很好,除了必须以“nil”结束 var args,但我想在 Objective-C 中没有办法解决这个问题。

记录器.h

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

记录器.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 

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

56赞 Sidd Menon 10/4/2011 #10

创建一个方法:

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

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

或者,要创建快捷方式,请将 NSString 转换为 C++ 字符串并在那里使用“+”。

47赞 Palimondo 3/16/2012 #11

好吧,由于冒号是一种特殊符号,但它方法签名的一部分,因此可以扩展 with 类别以添加这种非惯用样式的字符串连接: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);
}

评论

20赞 FreeAsInBeer 3/26/2013
一年前,我对此投了反对票,因为这不是一个很好的答案。为了处理连接大量字符串的问题,Palimondo 的实现需要实现大量看起来非常相似的方法,或者多次调用这些方法,从而产生大量代码,基本上只是连接字符串。使用这种方法,你不会得到任何好处。更不用说缺少命名参数了,这不仅是非标准的,而且令人困惑。stringWithFormat:
2赞 sudo 7/10/2014
最初的提问者提到,他从未说过使用两个以上的论据。我更喜欢这个答案而不是公认的答案。这很聪明。stringByAppendingString
27赞 FreeAsInBeer 3/16/2012 #12

在构建 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>"
};

评论

0赞 Norman H 5/25/2012
对于一个objective-c菜鸟,你能解释一下这个语法在做什么吗?这是在创建一个字符串数组并将它们连接起来吗?对任何文档的引用也会很酷。
2赞 FreeAsInBeer 5/26/2012
@NormanH:这实际上是C语言的一部分。经过一番挖掘,我找到了这个。它在“字符串连接”阶段下声明:所有相邻的字符串和宽字符串文字都是连接的。例如,“String ”“concatenation”变为“String concatenation”。
8赞 Sunday Ironfoot 7/4/2012 #13

缩短和使用 #define 怎么样:stringByAppendingString

#define and stringByAppendingString

因此,您将使用:

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

问题是它只适用于两个字符串,您需要为更多附加物包装额外的括号:

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

评论

0赞 Volomike 1/29/2016
XCode7 不再允许您使用此选项 -- 说“and”是一个保留词。但是,您可以改用“cat”来表示 conCATenation。我做到了,您的解决方案运行良好且非常简单。
84赞 Kyle Clegg 8/11/2012 #14

我不断回到这篇文章,并且总是最终对答案进行排序,以找到这个简单的解决方案,该解决方案可以根据需要处理尽可能多的变量:

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

例如:

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

评论

1赞 Falaen 8/7/2021
谢谢你发布这个!我是 Objective-C 的新手,我认为 stringWithFormat 是一个变量名,哈哈哈。谢谢这个例子!
11赞 justin 8/30/2012 #15

下面是一个简单的方法,使用新的数组文本语法:

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^
3赞 CommanderHK 11/12/2012 #16

尝试 stringWithFormat:

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

评论

0赞 Reimius 12/1/2012
为什么这有 2 个反对票?是因为这在另一个答案中已经提到过吗?
3赞 iforce2d 11/14/2012 #17

在处理字符串时,我发现将源文件设置为 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()];
0赞 user4951 1/22/2013 #18
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
3赞 Arun 4/5/2013 #19

您可以将 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];
8赞 Gobi M 4/29/2013 #20
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
3赞 LombaX 5/4/2013 #21

我的首选方法是这样的:

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

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

您可以通过将 join 方法添加到具有类别的 NSArray 来实现它:

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

@[]这是 的简短定义,我认为这是连接字符串的最快方法。NSArray

如果不想使用该类别,请直接使用以下方法:componentsJoinedByString:

NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];
6赞 Erhan Demirci 5/12/2013 #22

我尝试了这段代码。它对我有用。

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

评论

3赞 gnasher729 4/29/2015
这是有史以来最严重的 NSMutableString 滥用。NSMutableString 的全部意义在于,您不需要创建自动释放字符串的方法,但可以修改字符串本身。
1赞 ReinstateMonica3167040 2/4/2020
同意。至少使用 appendString:如果您使用的是 .NSMutableString
32赞 EthanB 6/1/2013 #23

宏观:

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

评论

2赞 typeoneerror 1/29/2016
有一段时间没有检查这个问题了,但这么多年后,我倾向于接受这是正确的答案!
1赞 Tommy 9/20/2016
可以说,这也比这个用例具有更好的行为——对于前者,如果参数是,你会得到一个例外,但如果接收者是,你会得到一个例外。因此,可以想象,送线器出现错误无声无息地失败的几率为 50%,异常的几率为 50%。这样一来,您就可以保证在列表中的任何位置都有例外。这至少是更可预测的。-[NSString stringByAppendingString:]nilstringConcatnil
9赞 Ian Clay 8/1/2013 #24
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

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

开始在 Xcode 应用程序中键入“N”,它会自动完成为“NSString”。 键入“str”,它会自动完成为“stringByAppendingString”。所以击键是相当有限的。

一旦你掌握了点击“@”键并按 Tab 键的窍门,编写可读代码的过程就不再是一个问题。这只是一个适应的问题。

评论

0赞 ReinstateMonica3167040 2/4/2020
你确实意识到你是在暗示他不想做的事情,对吧?
6赞 Anthony De Souza 4/7/2014 #25

在窗格中尝试以下操作lldb

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

哪些错误。

请改用 Alloc 和 method:initWithFormat

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

评论

1赞 Anthony De Souza 4/7/2014
...希望我有足够的声誉来发表评论,但希望这对其他人有所帮助。
4赞 Avinash Mishra 1/20/2016 #26
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
1赞 Volomike 1/29/2016 #27

当我测试时,这些格式中的任何一种都可以在 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”上使用宏。

评论

0赞 3/9/2017
如何制作?例如:sTest3 = sTest1 + sTest2;
0赞 ReinstateMonica3167040 2/4/2020
@user285594 这就是问题的重点:Objective-C 中不允许使用这种语法。请参阅其他答案。
0赞 Resty 5/27/2016 #28

让我们想象一下,你不知道有多少根弦。

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:@", "];
1赞 netshark1000 6/7/2016 #29

对于所有在UI-Test中需要此功能的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];
}
0赞 Yam 10/27/2020 #30

受到克里斯的想法的启发,我做了一个完美的宏恕我直言。 它支持插入 nil 元素,没有任何异常。NSMutableString

#import <libextobjc/metamacros.h>

#define STR_CONCAT(...) \
    ({ \
        __auto_type str__ = [NSMutableString string]; \
        metamacro_foreach_cxt(never_use_immediately_str_concatify_,, str__, __VA_ARGS__) \
        (NSString *)str__.copy; \
    })

#define never_use_immediately_str_concatify_(INDEX, CONTEXT, VAR) \
    [CONTEXT appendString:VAR ?: @""];

例:

STR_CONCAT(@"button_bg_", @(count).stringValue, @".png"); 
// button_bg_2.png

如果您愿意,可以使用 type 作为参数,方法是 using 而不是 。id[VAR description]NSString