提问人:typeoneerror 提问时间:2/4/2009 最后编辑:Forgetypeoneerror 更新时间:12/16/2020 访问量:841767
Objective-C 中连接 NSStrings 的快捷方式
Shortcuts in Objective-C to concatenate NSStrings
问:
在 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
其次,使用 an 通过方法进行连接。NSArray
componentsJoinedByString
评论
[NSMutableString appendString]
[NSString stringByAppendingStrings]
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
缩短时间的唯一方法是在该点附近使用自动完成。运算符是 C 的一部分,它不知道 Objective-C 对象。c = [a stringByAppendingString: b]
st
+
评论
#define
一个选项:
[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;
}
评论
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];
通过创建 AppendString (AS) 宏的快捷方式...
#define AS(A,B) [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");
注意:
如果使用宏,当然只需使用可变参数即可,请参阅 EthanB 的回答。
评论
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];
使用这种方式: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."];
评论
如果您有 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
享受。
评论
@
@"I" " really" " enjoy"...
NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";
Expected '@' in program
TABLE_NAME
这是为了更好的日志记录,并且仅日志记录 - 基于 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 个字符串创建一个新字符串,而不是在作为追加部分的任何一个字符串上调用它。
创建一个方法:
- (NSString *)strCat: (NSString *)one: (NSString *)two
{
NSString *myString;
myString = [NSString stringWithFormat:@"%@%@", one , two];
return myString;
}
然后,在您需要它的任何函数中,将字符串或文本字段或其他任何字段设置为此函数的返回值。
或者,要创建快捷方式,请将 NSString 转换为 C++ 字符串并在那里使用“+”。
好吧,由于冒号是一种特殊符号,但它是方法签名的一部分,因此可以扩展 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);
}
评论
stringWithFormat:
stringByAppendingString
在构建 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>"
};
评论
缩短和使用 #define 怎么样:stringByAppendingString
#define and stringByAppendingString
因此,您将使用:
NSString* myString = [@"Hello " and @"world"];
问题是它只适用于两个字符串,您需要为更多附加物包装额外的括号:
NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
评论
我不断回到这篇文章,并且总是最终对答案进行排序,以找到这个简单的解决方案,该解决方案可以根据需要处理尽可能多的变量:
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
例如:
NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
评论
下面是一个简单的方法,使用新的数组文本语法:
NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
^^^^^^^ create array ^^^^^
^^^^^^^ concatenate ^^^^^
尝试 stringWithFormat:
NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
评论
在处理字符串时,我发现将源文件设置为 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()];
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
您可以将 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];
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
我的首选方法是这样的:
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:@""];
我尝试了这段代码。它对我有用。
NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
评论
宏观:
// 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:@""];
评论
-[NSString stringByAppendingString:]
nil
stringConcat
nil
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];
在使用目标 C 几年后,我认为这是使用 Objective C 实现您想要实现的目标的最佳方式。
开始在 Xcode 应用程序中键入“N”,它会自动完成为“NSString”。 键入“str”,它会自动完成为“stringByAppendingString”。所以击键是相当有限的。
一旦你掌握了点击“@”键并按 Tab 键的窍门,编写可读代码的过程就不再是一个问题。这只是一个适应的问题。
评论
在窗格中尝试以下操作lldb
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
哪些错误。
请改用 Alloc 和 method:initWithFormat
[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
评论
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
当我测试时,这些格式中的任何一种都可以在 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”上使用宏。
评论
让我们想象一下,你不知道有多少根弦。
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:@", "];
对于所有在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];
}
受到克里斯的想法的启发,我做了一个完美的宏恕我直言。
它支持插入 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
评论