NSString(5)

2010. 04. 01
2日くらい調べていたんですが、どうしても自分の中で解釈しきれないので『プロパティリストへの変換(Converting String Contents Info a Property List)』の2つのメソッド、

・– propertyList
・- propertyListFromStringsFileFormat

の説明は端折らせていただきます。


●文字列の同定と比較(Identifying and Comparing Strings)

・– caseInsensitiveCompare:

– (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

指定した文字列と大文字/小文字の区別無しで比較し、その結果を返します
compare:options:メソッドをNSCaseInsensitiveSearchオプション(検索と比較オプション(Search and Comparison Options)参照)、全範囲で指定した場合と同じになります

比較対象の文字列をユーザに求める場合はlocalizedCaseInsensitiveCompare: を使用してください

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

NSString *str1 = @"YUKIHO";
NSString *str2 = @"yukiho";
if ([str1 caseInsensitiveCompare:str2] == NSOrderedSame){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES


・– localizedCaseInsensitiveCompare:

– (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)aString

指定した文字列を大文字/小文字の区別無しでローカライズした語彙を比較し、その結果を返します

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

NSString *str1 = @"ゆきぽ";
NSString *str2 = @"ゆきぽ";
NSString *result = [[NSString alloc] init];
switch ([str1 localizedCaseInsensitiveCompare:str2]) {
     case NSOrderedAscending:
        result = @"<";
        break;
    case NSOrderedSame:
        result = @"=";
        break;
    case NSOrderedDescending:
        result = @">";
        break;
}
NSLog = [NSString stringWithFormat:@"%@ %@ %@", str1, result, str2];    //    ゆきぽ = ゆきぽ

私の環境ではcaseInsensitiveCompare:とlocalizedCaseInsensitiveCompare:の結果は同じで、どこが違うのか確認できませんでした
(localizedCaseInsensitiveCompare:のサンプルコードでcaseInsensitiveCompare:に入れ替えても同じ結果になる)

localizedCaseInsensitiveCompare:/Cocoa APIとか(iPhoneとか)』では日本語は使えるという記述がありますが、双方英語も日本語も扱えますし、NSComparisonResultの判別も3種の結果を返すことができます


・– compare:

– (NSComparisonResult)compare:(NSString *)aString

指定した文字列を比較し、その結果を返します
compare:options:range:メソッドをオプション無し、全範囲で指定した場合と同じになります

比較対象の文字列をユーザに求める場合はlocalizedCompare:、またはlocalizedCaseInsensitiveCompare: を使用してください

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

NSString *str1 = @"MAKOTO";
NSString *str2 = @"makoto";
if ([str1 compare:str2] == NSOrderedSame){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES


・– localizedCompare:

– (NSComparisonResult)localizedCompare:(NSString *)aString

指定した文字列をローカライズした語彙で比較し、その結果を返します

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

NSString *str1 = @"まこぽ";
NSString *str2 = @"まこぽ";
NSString *result = [[NSString alloc] init];
switch ([str1 localizedCompare:str2]) {
     case NSOrderedAscending:
        result = @"<";
        break;
    case NSOrderedSame:
        result = @"=";
        break;
    case NSOrderedDescending:
        result = @">";
        break;
}
NSLog = [NSString stringWithFormat:@"%@ %@ %@", str1, result, str2];    //    まこぽ = まこぽ


・– compare:options:

– (NSComparisonResult)compare:(NSString *)aString options:(NSStringCompareOptions)mask

指定した文字列を検索オプリョン付きで比較し、その結果を返します
compare:options:range:メソッドを全範囲で指定した場合と同じになります

比較対象の文字列をユーザに求める場合はlocalizedCompare:、またはlocalizedCaseInsensitiveCompare: 、compare:options:range:locale:を使用してください

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch)を指定します
検索と比較オプション(Search and Comparison Options)参照)
or演算子『|』で複数オプションを指定可能です

NSString *str1 = @"RITSUKO";
NSString *str2 = @"ritsuko";
if ([str1 compare:str2 options:NSCaseInsensitiveSearch] == NSOrderedSame){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES


・– compare:options:range:

- (NSComparisonResult)compare:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)range

指定した文字列の範囲を検索オプリョン付きで比較し、その結果を返します
compare:options:range:locale:メソッドのlocaleをnilで指定した場合と同じになります

ユーザにロケールを求める場合はcompare:options:range:locale:でロケールを(currentLocale[NSLocale])で設定してください

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch)を指定します
検索と比較オプション(Search and Comparison Options)参照)
or演算子『|』で複数オプションを指定可能です

range:比較するレシーバの文字列の範囲を指定します
この範囲は検索するNSStringオブジェクトより大きく設定してはいけません
超える範囲を設定した場合、NSRangeExceptionで例外を発生させます

NSString *str1 = @"BST-72-CHIHAYA";
NSString *str2 = @"72";
if ([str1 compare:str2 options:NSNumericSearch range:NSMakeRange(4, 2)] == NSOrderedSame){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES

rangeで指定する範囲はあくまでレシーバの範囲のみで、aStringの範囲は指定されません
(aStringの全範囲とrangeの範囲指定の一部の比較になります)

従って両文字列の同一範囲を比較しようとして『NSString *str2 = "BST-72-YAYOI"』とすると、str1の『72』とstr2の『BST-72-YAYOI』を比較することになり、意図しない結果になってしまいます


・– compare:options:range:locale:

– (NSComparisonResult)compare:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)range locale:(id)locale

指定した文字列の範囲を検索オプリョン付きで語彙を比較し、その結果を返します

//比較対象の文字列をユーザに求める場合はcompare:options:range:locale:で、ロケールをlocale(currentLocale[NSLocale])にして使用してください

aString:比較対象となる文字列です
nilを指定した場合の動作は未定義なので、指定しないでください

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch)を指定します
検索と比較オプション(Search and Comparison Options)参照)
or演算子『|』で複数オプションを指定可能です

range:比較するレシーバの文字列の範囲を指定します
この範囲は検索するNSStringオブジェクトより大きく設定してはいけません
超える範囲を設定した場合、NSRangeExceptionで例外を発生させます

locale:NSLocaleのインスタンスで、nilを指定した場合はインスタンスを生成せずに現在のロケールになります
ユーザにロケールを求める場合はロケールを(currentLocale[NSLocale])で設定してください

NSString *str1 = @"ゆきぽ";
NSString *str2 = @"ぽ";
if ([str1 compare:str2 options:NSNumericSearch range:NSMakeRange(2, 1) locale:[NSLocale currentLocale]] == NSOrderedSame){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES


・– hasPrefix:

– (BOOL)hasPrefix:(NSString *)aString

指定した文字列がレシーバの先頭側からの文字と一致するか比較します
一致する場合はYESを返し、不一致あるいはaStringが空の場合はNOを返します

aString:比較する文字列

NSString *str1 = @"アサミンゴス";
NSString *str2 = @"アサミ";
if ([str1 hasPrefix:str2] == YES){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES


・– hasSuffix:

– (BOOL)hasSuffix:(NSString *)aString

指定した文字列がレシーバの終端側からの文字と一致するか比較します
一致する場合はYESを返し、不一致あるいはaStringが空の場合はNOを返します

aString:比較する文字列

NSString *str1 = @"アサミンゴス";
NSString *str2 = @"ミンゴス";
if ([str1 hasPrefix:str2] == YES){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    YES


・– isEqualToString:

– (BOOL)isEqualToString:(NSString *)aString

指定した文字列がレシーバの文字列とUnicodeベースで一致するか比較します
id、またはNSOrderSameが完全に一致する場合はYESを返し、不一致の場合はNOを返します
(正規表現での厳密な比較になるため、『Ö』などの合成済文字は区別されます)
比較する双方が文字列の場合、isEqualメソッドよりも高速です

aString:比較する文字列

NSString *str1 = @"ゆきぽ";
NSString *str2 = @"ゆきほ\u309A";
if ([str1 isEqualToString:str2] == YES){
    NSLog(@"YES");
}else{
    NSLog(@"NO");
}    //    NO


・hash

– (NSUInteger)hash

ハッシュテーブルのアドレスとして使える符号無し整数を返します
isEqualToString:メソッドで厳密に一致する文字列同士の場合は、同じハッシュ値になります
サブクラスでオーバーライドしてはいけません

NSString *str1 = @"ゆきぽ";
NSString *str2 = @"ゆきほ\u309A";
NSLog([NSString stringWithFormat:@"%u%u", [str1 hash], [str2 hash]]);    //    3576204779, 3938584492

ハッシュテーブルについては、きちんと説明する自信が無いのでWikipedia(ハッシュテーブル)などを参照してください


※ NSComparisonResult

NSComparisonResultはNSObjCRuntime.hで定義されています

NSOrderedAscending-1左オペランド<右オペランド
NSOrderedSame 左オペランド=右オペランド
NSOrderedDescending 左オペランド>右オペランド



参考文献

NSString Class Reference

Cocoa APIとか(iPhoneとか)/NSString

Studying Cocoa/NSString

Foundation Data Types Reference

Wikipedia/ハッシュテーブル

0 CommentsPosted in 資料





QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR