수색…


소개

NSString 클래스는 문자열 (일련의 문자)을 처리하는 Foundation 프레임 워크의 일부입니다. 문자열 비교, 검색 및 수정 방법도 포함됩니다.

비고

다양한 유형의 객체와 데이터 유형을 NSString에 중첩하려면 다음을 참조하십시오. Objective-C, 형식 지정자

창조

단순한:

NSString *newString = @"My String";

여러 문자열에서 :

NSString *stringOne = @"Hello";
NSString *stringTwo = @"world";
NSString *newString = [NSString stringWithFormat:@"My message: %@ %@",
                     stringOne, stringTwo];

가변 문자열 사용

NSString *stringOne = @"Hello";
NSString *stringTwo = @"World";
NSMutableString *mutableString = [NSMutableString new];
[mutableString appendString:stringOne];
[mutableString appendString:stringTwo];

NSData에서 :

에서 초기화 할 때 NSData 로 제공해야합니다 명시 적으로 인코딩 NSString 원시 데이터 스트림으로 표현하는 방법을 문자 추측 할 수 없습니다. 요즘 가장 일반적인 인코딩은 UTF-8이며 JSON과 같은 특정 데이터의 경우에도 필요합니다.

+[NSString stringWithUTF8String:] -[NSData bytes] 가 제공하지 않는 명시 적으로 NULL로 종료되는 C 문자열을 예상하므로 사용하지 마십시오 .

NSString *newString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

NSArray에서 :

NSArray *myArray = [NSArray arrayWithObjects:@"Apple", @"Banana", @"Strawberry", @"Kiwi", nil];
NSString *newString = [myArray componentsJoinedByString:@" "];

문자열 길이

NSString은 문자 수를 얻기위한 length 속성을 가지고 있습니다.

NSString *string = @"example";
NSUInteger length = string.length;       // length equals 7

Splitting Example 에서와 같이, NSStringUTF-16 을 사용하여 문자를 나타냅니다. 길이는 실제로 UTF-16 코드 단위의 수입니다. 이것은 사용자가 문자로인지하는 것과 다를 수 있습니다.

다음은 놀라운 일일 수 있습니다.

@"é".length == 1   // LATIN SMALL LETTER E WITH ACUTE (U+00E9)
@"é".length == 2   // LATIN SMALL LETTER E (U+0065) + COMBINING ACUTE ACCENT (U+0301)
@"❤️".length == 2  // HEAVY BLACK HEART (U+2764) + VARIATION SELECTOR-16 (U+FE0F)
@"🇮🇹".length == 4  // REGIONAL INDICATOR SYMBOL LETTER I (U+1F1EE) + REGIONAL INDICATOR SYMBOL LETTER T (U+1F1F9)

기술적으로 " grapheme clusters "로 알려진 사용자 인식 문자 수를 얻으려면 -enumerateSubstringsInRange:options:usingBlock: 사용하여 문자열을 반복하고 개수를 유지해야합니다. 이것은 Stack Overflow에 대한 Nikolai Ruhe의 답을 통해 입증됩니다.

케이스 변경

문자열을 대문자로 변환하려면, 사용 uppercaseString :

NSString *myString = @"Emphasize this";
NSLog(@"%@", [myString uppercaseString]; // @"EMPHASIZE THIS"

문자열을 소문자로 변환하려면, 사용 lowercaseString :

NSString *myString = @"NORMALIZE this";
NSLog(@"%@", [myString lowercaseString]; // @"normalize this"

문자열에있는 각 단어의 첫 글자 문자를 대문자로 사용 capitalizedString :

NSString *myString = @"firstname lastname";
NSLog(@"%@", [myString capitalizedString]); // @"Firstname Lastname"

문자열 비교

문자열은 isEqualToString: 사용하여 동일성을 비교합니다 isEqualToString:

== 연산자는 객체 식별을 테스트하고 객체의 논리 값을 비교하지 않으므로 사용할 수 없습니다.

NSString *stringOne = @"example";
NSString *stringTwo = [stringOne mutableCopy];

BOOL objectsAreIdentical = (stringOne == stringTwo);          // NO
BOOL stringsAreEqual = [stringOne isEqualToString:stringTwo]; // YES

표현식 (stringOne == stringTwo) 은 두 문자열의 메모리 주소가 (stringOne == stringTwo) 테스트합니다. 일반적으로 우리가 원하는 것은 아닙니다.

문자열 변수가 nil 수있는 경우이 경우에도주의해야합니다.

BOOL equalValues = stringOne == stringTwo || [stringOne isEqualToString:stringTwo];

이 조건은 문자열의 값이 같거나 둘 다 nil 경우 YES 반환합니다.

알파벳순으로 두 개의 문자열을 정렬하려면 compare :를 사용하십시오.

NSComparisonResult result = [firstString compare:secondString];

NSComparisonResult 는 다음과 같습니다.

  • NSOrderedAscending : 첫 번째 문자열은 두 번째 문자열 앞에옵니다.
  • NSOrderedSame : 문자열이 동일합니다.
  • NSOrderedDescending : 두 번째 문자열은 첫 번째 문자열 앞에옵니다.

두 문자열이 같은지 비교하려면 isEqualToString: 사용 isEqualToString: .

BOOL result = [firstString isEqualToString:secondString];

빈 문자열 ( @"" )과 비교하려면 length 더 잘 사용하십시오.

BOOL result = string.length == 0;

문자열 배열 결합

NSStringNSArray 를 새로운 NSString 으로 결합하려면 :

NSArray *yourWords = @[@"Objective-C", @"is", @"just", @"awesome"];
NSString *sentence = [yourWords componentsJoinedByString:@" "];

// Sentence is now: @"Objective-C is just awesome"

인코딩 및 디코딩

// decode
NSString *string = [[NSString alloc] initWithData:utf8Data
                                         encoding:NSUTF8StringEncoding];

// encode
NSData *utf8Data = [string dataUsingEncoding:NSUTF8StringEncoding];

지원되는 일부 인코딩은 다음과 같습니다.

  • NSASCIIStringEncoding
  • NSUTF8StringEncoding
  • NSUTF16StringEncoding (== NSUnicodeStringEncoding )

utf8Data.bytes 에는 C 문자열에 필요한 종료 null 문자가 포함되지 않습니다. C 문자열이 필요하면 UTF8String 사용하십시오.

const char *cString = [string UTF8String];
printf("%s", cString);

파편

문자열을 분리 문자로 나눈 부분 배열로 나눌 수 있습니다.

NSString * yourString = @"Stack,Exchange,Network";
NSArray * yourWords = [yourString componentsSeparatedByString:@","]; 
// Output: @[@"Stack", @"Exchange", @"Network"]

몇 가지 다른 구분 기호 로 분리해야하는 경우 -[NSString componentsSeparatedByCharactersInSet:] .

NSString * yourString = @"Stack Overflow+Documentation/Objective-C";
NSArray * yourWords = [yourString componentsSeparatedByCharactersInSet:
                      [NSCharacterSet characterSetWithCharactersInString:@"+/"]];
// Output: @[@"Stack Overflow", @"Documentation", @"Objective-C"]`

문자열을 개별 문자 로 분리해야하는 경우 문자열의 길이를 반복하고 각 문자를 새 문자열로 변환하십시오.

NSMutableArray * characters = [[NSMutableArray alloc] initWithCapacity:[yourString length]];
for (int i = 0; i < [myString length]; i++) {
    [characters addObject: [NSString stringWithFormat:@"%C", 
                                      [yourString characterAtIndex:i]];
}

길이 예제 에서와 같이 여기에있는 "문자"는 UTF-16 코드 단위이며 사용자가 문자로 보는 것만은 아닙니다. 이 루프를 @"🇮🇹" 와 함께 사용하면 4 개의 조각으로 나뉘어집니다.

사용자가 인식하는 문자 목록을 얻으려면 -enumerateSubstringsInRange:options:usingBlock: .

NSMutableArray * characters = [NSMutableArray array];
[yourString enumerateSubstringsInRange:(NSRange){0, [yourString length]}
                               options:NSStringEnumerationByComposedCharacterSequences
                            usingBlock:^(NSString * substring, NSRange r, NSRange s, BOOL * b){
                                [characters addObject:substring];
                            }];

이것은 이탈리아 깃발과 같은 grapheme 클러스터를 단일 부분 문자열로 유지합니다.

하위 문자열 검색

문자열에 하위 문자열이 포함되어 있는지 검색하려면 다음을 수행하십시오.

NSString *myString = @"This is for checking substrings";
NSString *subString = @"checking"; 

BOOL doesContainSubstring = [myString containsString:subString];  // YES

iOS 7 또는 OS X 10.9 (또는 그 이전 버전)을 타겟팅하는 경우 :

BOOL doesContainSubstring = ([myString rangeOfString:subString].location != NSNotFound);  // YES

C 문자열로 작업하기

NSStringconst char 로 변환하려면 -[NSString UTF8String] .

NSString *myNSString = @"Some string";
const char *cString = [myNSString UTF8String];

문자열이 UTF-8이 아닌 다른 것으로 인코딩 된 경우 -[NSString cStringUsingEncoding:] 사용할 수도 있습니다.

역방향 경로 사용을 위해 -[NSString stringWithUTF8String:] :

const *char cString = "Some string";
NSString *myNSString = [NSString stringWithUTF8String:cString];
myNSString = @(cString); // Equivalent to the above.

당신은 일단 const char * , 당신의 배열과 유사하게 작업 할 수 chars :

printf("%c\n", cString[5]);

문자열을 수정하려면 사본을 만드십시오.

char *cpy = calloc(strlen(cString)+1, 1);
strncpy(cpy, cString, strlen(cString));
// Do stuff with cpy
free(cpy);

선행 및 후행 공백 제거

NSString *someString = @"   Objective-C Language  \n";
NSString *trimmedString = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//Output will be - "Objective-C Language"

메서드 stringByTrimmingCharactersInSet은 지정된 문자 집합에 포함 된 String 문자의 양쪽 끝을 제거하여 만든 새 문자열을 반환합니다.

공백이나 개행 만 제거 할 수도 있습니다.

// Removing only WhiteSpace
NSString *trimmedWhiteSpace = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
//Output will be - "Objective-C Language  \n"

// Removing only NewLine
NSString *trimmedNewLine = [someString stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
//Output will be - "   Objective-C Language  "

서식 지정

NSString 형식은 printf ANSI-C 함수에서 사용할 수있는 모든 형식 문자열을 지원합니다. 이 언어로 만든 유일한 추가 사항은 모든 Objective-C 개체의 서식을 지정하는 데 사용되는 %@ 기호입니다.

정수 포맷 가능

int myAge = 21;
NSString *formattedAge = [NSString stringWithFormat:@"I am %d years old", my_age];

또는 NSObject에서 서브 클래 싱 된 모든 객체

NSDate *now = [NSDate date];
NSString *formattedDate = [NSString stringWithFormat:@"The time right now is: %@", now];

형식 지정자의 전체 목록은 Objective-C, 형식 지정자, 구문을 참조하십시오.

Objective-C NSString 반대로하기

// myString is "hi"
NSMutableString *reversedString = [NSMutableString string];
NSInteger charIndex = [myString length];
while (charIndex > 0) {
    charIndex--;
    NSRange subStrRange = NSMakeRange(charIndex, 1);
    [reversedString appendString:[myString substringWithRange:subStrRange]];
}
NSLog(@"%@", reversedString); // outputs "ih"


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow