Objective-C에서 NSString을 연결하는 단축키
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;
}
NSString 리터럴 이 2 개있는 경우 다음 과 같이 할 수도 있습니다.
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];
콜론 종류의 특수 기호이지만, 글쎄, 인 방법 서명의 일부, exted에 가능하다 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];
또는
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>"
};
AppendString (AS) 매크로를 생성하여 바로 가기 ...
# 정의 AS (A, B) [(A) stringByAppendingString : (B)]
NSString * myString = @ "이"; 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 CI와 함께 2 년이 지난 후 이것이 달성하려는 목표를 달성하기 위해 Objective C와 함께 작업하는 가장 좋은 방법이라고 생각합니다.
Xcode 애플리케이션에서 "N"을 입력하면 "NSString"으로 자동 완성됩니다. "str"을 입력하면 "stringByAppendingString"으로 자동 완성됩니다. 따라서 키 입력은 매우 제한적입니다.
"@"키를 누르고 가독성 코드를 작성하는 과정을 탭하면 더 이상 문제가되지 않습니다. 적응의 문제 일뿐입니다.
c = [a stringByAppendingString: b]
더 짧게 만드는 유일한 방법 은 st
지점 주변에서 자동 완성을 사용하는 것 입니다. +
운영자는 목표 - C 객체에 대해 알고하지 않는 C의 일부입니다.
어떻게 단축에 대한 stringByAppendingString
과 사용 # 정의 :
#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"];
Was trying the following in the lldb
pane
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
which errors.
instead use alloc and initWithFormat
method:
[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
This is for better logging, and logging only - based on dicius excellent multiple argument method. I define a Logger class, and call it like so:
[Logger log: @"foobar ", @" asdads ", theString, nil];
Almost good, except having to end the var args with "nil" but I suppose there's no way around that in 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
In order to only concat strings, I'd define a Category on NSString and add a static (+) concatenate method to it that looks exactly like the log method above except it returns the string. It's on NSString because it's a string method, and it's static because you want to create a new string from 1-N strings, not call it on any one of the strings that are part of the append.
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
Try stringWithFormat:
NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
When dealing with strings often I find it easier to make the source file ObjC++, then I can concatenate std::strings using the second method shown in the question.
std::string stdstr = [nsstr UTF8String];
//easier to read and more portable string manipulation goes here...
NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];
My preferred method is this:
NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";
NSString *joinedString = [@[firstString, secondString, thirdString] join];
You can achieve it by adding the join method to NSArray with a category:
#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
return [self componentsJoinedByString:@""];
}
@end
@[]
it's the short definition for NSArray
, I think this is the fastest method to concatenate strings.
If you don't want to use the category, use directly the componentsJoinedByString:
method:
NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];
You can use NSArray as
NSString *string1=@"This"
NSString *string2=@"is just"
NSString *string3=@"a test"
NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil];
NSString *fullLengthString = [myStrings componentsJoinedByString:@" "];
or
you can use
NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];
Either of these formats work in XCode7 when I tested:
NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
@"This"
" and that"
" and one more"
};
NSLog(@"\n%@\n\n%@",sTest1,sTest2);
For some reason, you only need the @ operator character on the first string of the mix.
However, it doesn't work with variable insertion. For that, you can use this extremely simple solution with the exception of using a macro on "cat" instead of "and".
For all Objective C lovers that need this in a UI-Test:
-(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:@""];
In Swift
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"
Also, you can use +=
operator for the same as below...
var str3 = "Some String"
str3 += str2 // str3 would be "Some String is just a test"
Let's imagine that u don't know how many strings there.
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:@", "];
참고URL : https://stackoverflow.com/questions/510269/shortcuts-in-objective-c-to-concatenate-nsstrings
'development' 카테고리의 다른 글
PHP와 열거 (0) | 2020.09.27 |
---|---|
Vim에 텍스트를 붙여 넣을 때 자동 들여 쓰기 끄기 (0) | 2020.09.27 |
이미 리베이스를 시작한 경우 두 개의 커밋을 하나로 병합하려면 어떻게해야합니까? (0) | 2020.09.27 |
PHP와 함께 혜성을 사용하십니까? (0) | 2020.09.25 |
Android UI를 구축하는 쉬운 방법? (0) | 2020.09.25 |