在Objective-C来连接NSString的快捷键
-
21-08-2019 - |
题
是否有任何快捷方式(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";
解决方案
两个答案我能想到的...也不是特别的只是有一个连接符愉快。
首先,使用NSMutableString
,其具有appendString
方法,除去一些需要额外的温度字符串。
其次,使用NSArray
经由componentsJoinedByString
方法来连接。
其他提示
的选项:
[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个的NSString的文字上,你也可以只做到这一点:
NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";
这也是有用的用于接合#定义:
#define STRINGA @"Also, I don't know "
#define STRINGB @"where food comes from."
#define JOINED STRINGA STRINGB
享受。
我回头率这篇文章,最终总是通过答案排序找到这个简单的解决方案,与需要尽可能多的变量如下:
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
例如:
NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
那么,结肠癌是一种特殊的符号,但是的方法签名的一部分,有可能加长的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);
}
创建方法:
- (NSString *)strCat: (NSString *)one: (NSString *)two
{
NSString *myString;
myString = [NSString stringWithFormat:@"%@%@", one , two];
return myString;
}
那么,在什么功能,你需要它,你的字符串或文本字段或任何设置为这个函数的返回值。
或者,使一个快捷方式,转换的NSString成C ++串并使用“+”在那里。
使用这种方式:
NSString *string1, *string2, *result;
string1 = @"This is ";
string2 = @"my string.";
result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];
OR
result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my 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:@""];
在为构建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>"
};
通过创建快捷方式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];
下面是一个简单的方法,使用新的数组文本语法:
NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
^^^^^^^ create array ^^^^^
^^^^^^^ concatenate ^^^^^
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];
在几年现在目标C我觉得这是有目标C合作,实现你想实现什么是最好的方式。
开始于在Xcode应用程序“N”键控,并将其自动填充到“的NSString”。 在“海峡”键,它自动填充到“stringByAppendingString”。所以键击是相当有限的。
一旦你打的“@”键和Tab键写可读的代码的过程中恒不再成为一个问题。这仅仅是一个适应的问题。
只有这样,才能使c = [a stringByAppendingString: b]
任何较短的是在围绕st
点使用自动完成功能。的操作者+
是C,其不知道Objective-C对象的一部分。
如何缩短stringByAppendingString
和使用的的#define 强>:
#define and stringByAppendingString
因此,需要使用:
NSString* myString = [@"Hello " and @"world"];
问题是,它仅适用于两个字符串,你需要额外的包裹括号内为更多的追加:
NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
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];
我尝试这样做的代码。它是为我工作。
NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
试图在lldb
窗格中的下列
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
其中的错误。
代替使用alloc和initWithFormat
方法:
[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
这是为了更好的记录,只记录 - 基于dicius优良多个参数的方法。我定义了一个记录器类,并调用它像这样:
[Logger log: @"foobar ", @" asdads ", theString, nil];
差不多好了,除了不得不结束与“无”的变参但我想有围绕在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一个类别,并添加一个静态的(+)串连方法它,看起来就像上面除了它返回字符串log方法。这是对的NSString因为它是一个字符串的方法,因为你要创建1-N串一个新的字符串,而不是调用它是追加的部分字符串的任何一个是静态的。
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
尝试stringWithFormat:
NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
当处理字符串经常我发现很容易使源文件ObjC ++,那么我可以使用在问题中所示的第二方法串联的std ::字符串。
std::string stdstr = [nsstr UTF8String];
//easier to read and more portable string manipulation goes here...
NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];
我的优选的方法是这样的:
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:@""];
可以使用的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];
无论这些格式在XCode7工作的时候进行测试:
NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
@"This"
" and that"
" and one more"
};
NSLog(@"\n%@\n\n%@",sTest1,sTest2);
由于某些原因,你只需要在组合的第一串@运算符。
但是,它不与可变插入工作。对于这一点,你可以使用这种极其简单的解决方案使用的“猫”宏的异常,而不是“和”
有关需要此在UI试验所有目标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];
}
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
在的夫特强>
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"
让我们想象一下,你不知道有多少个字串。
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:@", "];