programing

NSString을 연결하기 위한 Objective-C 바로 가기

golfzon 2023. 4. 9. 22:40
반응형

NSString을 연결하기 위한 Objective-C 바로 가기

「 「 「 「 」 「 」 )의 ?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";

옵션:

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

내가 생각할 수 있는 두 가지 답은...둘 다 단순히 연결 연산자를 갖는 것만큼 즐겁지 않다.

먼저'를 ,NSMutableString에는)가 .appendString방법, 추 method임 method method method method method method method method method method method method method method method.

번째, '어느 정도'를 사용하세요.NSArraycomponentsJoinedByString★★★★★★ 。

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

즐거운 시간 되세요.

이 게시물로 계속 돌아가면 필요한 만큼 많은 변수를 처리하는 간단한 솔루션을 찾기 위해 항상 답변을 정리합니다.

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

예를 들어 다음과 같습니다.

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

메서드를 만듭니다.

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

그런 다음 필요한 함수에서 문자열 또는 텍스트 필드 또는 기타 모든 값을 이 함수의 반환 값으로 설정합니다.

또는 바로 가기를 만들려면 NSString을 C++ 문자열로 변환하고 여기에 '+'를 사용합니다.

콜론은 일종의 특별한 기호이지만 방법 서명의 일부이기 때문에, 콜론은 확장될 수 있습니다NSString카테고리를 지정하여 이 비자동 문자열 연결 스타일을 추가합니다.

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

콜론으로 구분된 인수를 필요한 만큼 정의할 수 있습니다.;-)

척도로 for은척 for, added added added added added 했습니다.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);
}

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

매크로:

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

웹 서비스에 대한 요청을 작성할 때 다음과 같은 작업을 수행하는 것이 매우 쉬우며 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>"
};

Append String(AS) " " " "...

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

주의:

매크로를 사용하고 있는 경우는, 물론, 다양한 인수를 사용해 실행해 주세요.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"];

Objective C에서 몇 년을 일한 후, 저는 이것이 Objective C에서 여러분이 달성하고자 하는 것을 달성하기 위한 가장 좋은 방법이라고 생각합니다.

Xcode 어플리케이션에서 "N" 키를 누르면 "NSString"으로 자동 보완됩니다.str을 입력하면 stringByAppendingString으로 자동 보완됩니다.그래서 키 입력이 상당히 제한적입니다.

일단 당신이 "@" 키를 누르고 읽을 수 있는 코드를 쓰는 과정을 익히면, 더 이상 문제가 되지 않습니다.그것은 단지 적응의 문제이다.

「 」를 만드는 c = [a stringByAppendingString: b]합니다.st, 포인트.+객관적-C로 하다

짧게 하는 건 어때?stringByAppendingString#syslog를 사용합니다.

#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 " " pane pane"

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

어떤 에러인지.

와 allocate를 합니다.initWithFormat★★★★

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

이는 우수한 다중 인수 방식을 기반으로 로깅을 개선하고 로깅만 하기 위한 것입니다.Logger 클래스를 정의하고 다음과 같이 부릅니다.

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

varar args를 nil로 끝내는 것 빼고는 거의 괜찮지만 Objective-C에서는 그것을 피할 방법이 없을 것 같습니다.

Logger.h

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

로거

@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에서 카테고리를 정의하고 위의 로그 메서드와 동일한 정적(+) 연결 메서드를 추가합니다.단, 문자열은 반환됩니다.이것은 문자열 메서드이기 때문에 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:@""];

NSAray는 다음과 같이 사용할 수 있습니다.

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

어떤 이유에서인지 혼합의 첫 번째 문자열에는 @ 연산자 문자만 필요합니다.

단, 변수 삽입에서는 동작하지 않습니다.그 때문에, 「and」가 아닌 「cat」에 매크로를 사용하는 것을 제외하고, 지극히 심플한 솔루션을 사용할 수 있습니다.

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

현이 몇 개인지 모른다고 가정해 봅시다.

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

영감을 받아NSMutableString크리스의 아이디어, 완벽한 매크로 임호를 만듭니다.예외 없이 0 요소 삽입을 지원합니다.

#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

괜찮으시다면,id를 사용하여 파라미터로 입력하다[VAR description]대신NSString.

언급URL : https://stackoverflow.com/questions/510269/shortcuts-in-objective-c-to-concatenate-nsstrings

반응형