Objective-C Language
NSString
サーチ…
前書き
NSStringクラスは、文字列(一連の文字)を処理するFoundationフレームワークの一部です。また、文字列を比較、検索、変更する方法も含まれています。
備考
さまざまなタイプのオブジェクトとデータ型をNSStringにネストするには、 Objective-C、Format Specifiersを参照してください。
創造
シンプル:
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から:
NSString
から初期化するとき、明示的なエンコーディングが提供されなければなりません。 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
を取得するためのlength
プロパティがあります。
NSString *string = @"example";
NSUInteger length = string.length; // length equals 7
Splittingの例のように、 NSString
はUTF-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)
技術的には " 書記素クラスタ "と呼ばれるユーザー認識文字の数を取得するには、 -enumerateSubstringsInRange:options:usingBlock:
を-enumerateSubstringsInRange:options:usingBlock:
して文字列を繰り返し処理し、カウントを保持する必要があります。これは、Stack Overflowに関するNikolai Ruheの答えで実証されています 。
ケースを変える
Stringを大文字に変換するには、uppercaseStringを使用し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:
が等しいかisEqualToString:
が比較されisEqualToString:
==
演算子は、オブジェクトのアイデンティティをテストし、オブジェクトの論理値を比較しないため、使用できません。
NSString *stringOne = @"example";
NSString *stringTwo = [stringOne mutableCopy];
BOOL objectsAreIdentical = (stringOne == stringTwo); // NO
BOOL stringsAreEqual = [stringOne isEqualToString:stringTwo]; // YES
式(stringOne == stringTwo)
は、2つの文字列のメモリアドレスが同じであるかどうかをテストします。通常、これは必要なものではありません。
文字列変数がnil
ことができる場合は、この場合も注意する必要があります。
BOOL equalValues = stringOne == stringTwo || [stringOne isEqualToString:stringTwo];
文字列の値が等しい場合、または両方がnil
場合、この条件はYES
返します。
2つの文字列をアルファベット順に並べ替えるには、 compare
:を使います
NSComparisonResult result = [firstString compare:secondString];
NSComparisonResult
は次のいずれかです。
-
NSOrderedAscending
:最初の文字列が2番目の文字列の前に来ます。 -
NSOrderedSame
:文字列が等しい。 -
NSOrderedDescending
:2番目の文字列が最初の文字列の前に来ます。
2つの文字列の等価性を比較するには、 isEqualToString:
使用しisEqualToString:
。
BOOL result = [firstString isEqualToString:secondString];
空の文字列( @""
)と比較するには、 length
使います。
BOOL result = string.length == 0;
ストリングの配列への結合
NSString
NSArray
を新しい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文字列に必要な終了文字が含まれていないことに注意してください。 C文字列が必要な場合は、 UTF8String
使用し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:
使用し-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];
}];
これはイタリアのフラグのような書記素クラスタを単一の部分文字列として保持します。
サブストリングの検索
文字列に部分文字列が含まれているかどうかを調べるには、次のようにします。
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文字列の操作
NSString
をconst 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"