Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中连接NSString的快捷方式_Objective C_Nsstring_String Concatenation - Fatal编程技术网

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

Objective-C中连接NSString的快捷方式,objective-c,nsstring,string-concatenation,Objective C,Nsstring,String Concatenation,Objective-C中是否有(stringByAppendingString:)字符串连接的快捷方式,或者通常使用NSString的快捷方式 例如,我想: NSString *myString = @"This"; NSString *test = [myString stringByAppendingString:@" is just a test"]; 更像是: string myString = "This"; string test = myString + " is just a

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
方法连接。

使
c=[a stringByAppendingString:b]
更短的唯一方法是在
st
点附近使用autocomplete。
+
操作符是C的一部分,它不知道Objective-C对象。

一个选项: 另一种选择: 我猜您对多个附件(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;
}

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

#define AS(A,B) [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test"); #定义为(A,B)[(A)字符串通过附加字符串:(B)]
NSString*myString=@“This”; NSString*test=AS(myString,@“只是一个测试”); 注意:

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

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

使用
stringByAppendingString:
,方法如下:

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 *string1, *string2, *result;

string1 = @"This is ";
string2 = @"my string.";

result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];


如果您有两个NSString文本,也可以这样做:

NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";
这对于连接也很有用#定义:


享受

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

[Logger log: @"foobar ", @" asdads ", theString, nil];
几乎不错,除了必须以“nil”结束var args,但我想在Objective-C中没有办法解决这个问题

记录器.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上定义一个类别,并向其添加一个静态(+)concatenate方法,该方法与上面的log方法完全相同,只是它返回字符串。它位于NSString上,因为它是一个string方法,而它是静态的,因为您希望从1-N个字符串创建一个新字符串,而不是在属于append的任何一个字符串上调用它

创建一个方法:

- (NSString *)strCat: (NSString *)one: (NSString *)two
{
    NSString *myString;
    myString = [NSString stringWithFormat:@"%@%@", one , two];
    return myString;
}
然后,在任何需要它的函数中,将字符串或文本字段或任何内容设置为该函数的返回值


或者,为了快捷方式,将NString转换成C++字符串,使用“+”,.< /P> < P>,冒号是特殊符号,但是方法签名的一部分,可以使用类别“<代码> NString < /Cord> >添加这个“强>非惯用< /强>字符串连接样式:

[@"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+Concatenation.h
#进口
@接口字符串(连接)
-(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*)字符串。。。;
@结束
//NSString+Concatenation.m
#导入“NSString+Concatenation.h”
@实现NSString(串联)
-(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*)字符串。。。
{
va_列表参数;
va_开始(参数、字符串);
NSString*s;
NSString*con=[self-stringByAppendingString:strings];
而((s=va_arg(args,NSString*))
con=[con stringByAppendingString:s];
va_端(args);
返回con;
}
@结束
//NSString+ConcatenationTest.h
#进口
#导入“NSString+Concatenation.h”
@接口NSString\u连接测试:SenTestCase
@结束
//NSString+ConcatenationTest.m
#导入“NSString+ConcatenationTest.h”
@NSString\U连接测试的实现
-(void)TestSimpleContainement
{
STAssertEqualObjects([@“a”:@“b”],@“ab”,无);
STAssertEqualObjects([@“a”:“b”:“c”],@“abc”,无);
STAssertEqualObjects([@“a”:“b”:“c”:“d”],@“abcd”,无);
STAssertEqualObjects([@“a”:“b”:“c”:“d”:“e”],“abcde”,无);
STAssertEqualObjects([@“this”:@“is”:@“string”:@“concatenation”],
@“这是字符串连接”,nil);
}
-(void)testVarArgConcatenation
{
NSString*串联=[@“a”concat:@“b”,nil];
STAssertEqualObjects(串联,@“ab”,nil);
级联=[级联concat:@“c”,@“d”,级联,nil];
STAssertEqualObjects(串联,@“abcdab”,nil);
}

在构建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>"
};
NSString*postBody={
@""
@""
@" "
@"  "
@“测试”
@"  "
@" "
@""
};

如何通过添加字符串来缩短
字符串,并使用\define

#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()];
您可以使用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:@" "];

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:@""];
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];
#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
    return [self componentsJoinedByString:@""];
}
@end
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 *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
[[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];
NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
  @"This"
  " and that"
  " and one more"
};

NSLog(@"\n%@\n\n%@",sTest1,sTest2);
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:@", "];
-(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];
}
#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