Foundation(文字列)

2010. 04. 07
やる前から気付いていたことですが、クラスメソッドの解説は思いの外手間取る作業で、基礎知識が乏しい上での和訳は誤った情報を提供することになりそうなので、一旦止めます。

何度目の方針転換か分かりませんが、取り敢えず『iPhone SDKプログラミング大全』を一通り読んで次の本に進みたいので、取り上げているメソッドのみをピックアップしていこうと思います。

文字列に関しては先のNSStringと内容が重複しますが、『iPhone SDKプログラミング大全』読者向けに再編集します。


●文字列のクラス図

FoundationCore Foundation
NSCharacterSetNSMutableCharacterSetCFCharacterSetCFMutableCharacterSet
NSStringNSMutableStringCFStringCFMutableString
NSFormatterNSDateFormatter-CFDateFormatter
NSNumberFormatterCFNumberFormatter
NSScanner-
NSSortDescriptor-


●文字列の作成

NSString *str;
str = @"BST-72-CHIHAYA";
NSLog(str);    //    BST-72-CHIHAYA

本文では『NSString *string;』としていますが、実行すると

Local declaration of 'string' hides instance variable
(クラス変数とメソッドの引数名が重複してます)

という警告が出ます。

コンパイルも実行も可能ではありますが、こういう『直訳するとよく分からないエラーの出る変数名をサンプルコードにする』のはどうかな?と思います。
(現在はエラー名を くぃどぅるるる ぐぐればそれなりに情報を集められますが・・・)

変数等の命名に関しては『詳解 Objective-C 2.0』の『コーディングの指針』が参考になります
(私はまだちゃんと読んでないんですけれど・・・)

この後もインスタンス名にlength、range、error、scannerなどそのままな名前が付けられていまして、分かり易くしようとしているんだけど、ラベルかインスタンス名かクラス変数なのか紛らわしいので、サンプルコードでは意識して変更しています。


●文字列の操作

// 文字列の作成
NSString *title = @"BST-72-CHIHAYA";

// 文字列の長さの取得
int strLength;
strLength = [title length];
NSLog([NSString stringWithFormat:@"String:%@, Length = %d", title, strLength]);
//    String:BST-72-CHIHAYA, Length = 14

// 文字列の範囲の取得
NSRange strRange;
strRange = [title rangeOfString:@"72"];
NSLog([NSString stringWithFormat:@"Location:%d, Length:%d", strRange.location, strRange.length]);
//    Location:4, Length:2

// 部分文字列の置換
NSString *newTitle;
newTitle = [title stringByReplacingOccurrencesOfString:@"CHIHAYA" withString:@"YAYOI"];
NSLog(newTitle);
//    BST-72-YAYOI

// 文字列の分割
NSString *subStr;
subStr = [title substringFromIndex:7];
//    CHIHAYA 

新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)では長さの変数『length』の宣言が『lnegth』になっていました。


・– length

– (NSUInteger)length

Unicode文字列の文字数を返します


・– rangeOfString:

– (NSRange)rangeOfString:(NSString *)aString

指定した文字列を検索し、最初に見つけた文字列の範囲を返します
指定した文字列が見つけられない、もしくは空の文字列(@"")を指定した場合は{NSNotFound, 0}を返します

aString:検索する文字列(nilを指定することはできません)
(aStringがnilの場合、NSInvalidArgumentExceptionを呼び出します)


・– stringByReplacingOccurrencesOfString:withString:

– (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

targetの文字列をreplacementの文字列に全て置換し、新しい文字列を作ります

target:置換対象になる文字列を指定します
replacement:置換する文字列を指定します


・– substringFromIndex:

– (NSString *)substringFromIndex:(NSUInteger)anIndex

先頭から指定した文字位置までを削除した部分文字列を、新規の文字列で返します

anIndex:文字列の中から切り取る部分までの文字位置を指定します
文字列の長さを超える文字位置を指定した場合、NSRangeExceptionで例外を発生させます
文字列の長さと同じ文字位置を指定した場合は、空の文字列を返します


●ファイルパスとしての操作

// ファイルパスの文字列を設定
NSString *filePath = @"/usr/iPhone/HelloWorld_iPhone/HelloWorld.xcodeproj";

// ファイルの拡張子を取得
NSString *fileExt = [filePath pathExtension];
NSLog(fileExt);
//    xcodeproj

// パスの最後の要素を取得(この例ではファイル名を取得)
NSString *fileName = [filePath lastPathComponent];
NSLog(fileName);
//    HelloWorld.xcodeproj

// パスの最後の要素を削除して取得 (この例ではファイルのあるフォルダ名を取得)
NSString *folderName = [filePath stringByDeletingLastPathComponent];
NSLog(folderName); 
//    /usr/iPhone/HelloWorld_iPhone

本書のサンプルコードで『ファイル名の取得』として- lastPathComponentを使用していますが、あくまでパスの最後の要素を抽出するもので、パスの最後がフォルダであればフォルダ名を返します。
(ファイルかフォルダかという区別はできません)

その次の『ファイルが存在するディレクトリを取得』も同様で、– stringByDeletingLastPathComponentは最後の要素を削除して返すメソッドです。


・– pathExtension

– (NSString *)pathExtension

ファイルパスの拡張子を返します

戻り値の例を下表に示します

レシーバの文字列戻り値の文字列
"/tmp/scratch.tiff""tiff"
"/tmp/scratch"""(空の文字列)
"/tmp/"""(空の文字列)
"/tmp/scratch..tiff""tiff"

このメソッドはファイルパスに対してのみ使用してください(URLなどで使わないこと)


・– lastPathComponent

– (NSString *)lastPathComponent

パスの最後の要素を返します

戻り値の例を下表に示します

レシーバの文字列戻り値の文字列
"/tmp/scratch.tiff""scratch.tiff"
"/tmp/scratch""scratch"
"/tmp/""tmp"
"scratch""scratch"
"/""/"

このメソッドはファイルパスに対してのみ使用してください(URLなどで使わないこと)


・– stringByDeletingLastPathComponent

– (NSString *)stringByDeletingLastPathComponent

パスの最後の要素をパスの区切り文字『/』と共に削除し、新規の文字列を返します

ルートパスの場合は変更しません

戻り値の例を下表に示します

レシーバの文字列戻り値の文字列
"/tmp/scratch.tiff""/tmp"
"/tmp/lock/""/tmp"
"/tmp/""/"
"/tmp""/"
"/""/"
"scratch.tiff"""(空の文字列)

このメソッドはファイルパスに対してのみ使用してください(URLなどで使わないこと)


●テキストエンコーディング

// UTF8の日本語文字列を作成
NSString *jpString = [NSString stringWithUTF8String:"タレがあってアメがあって タニシができれぅ~♪"];

// 指定したエンコーディング(Shift-JIS)でファイルに書き出す
NSError *fileError;
[jpString writeToFile:@"/Users/yayoi/Desktop/yayoi.txt" atomically: encoding:NSShiftJISStringEncoding error:&fileError];

// 指定したエンコーディング(code page 932, also for Windows)で読み込む
NSStringEncoding dosEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSJapanese);
NSString *dosString = [NSString stringWithContentsOfFile:@"/Users/yayoi/Desktop/chihaya.txt" encoding:dosEncoding error:&fileError];

NSLog(dosString);

エンコーディングの種類については『文字コードのエンコーディング』と『Core Foundationのエンコーディング』を参照してください。

ファイルの読み込みでは、テキストエディットのエンコーディングで『日本語(Windows, DOS)』形式で保存した標準テキストファイルの読み込みを確認しました。


・+ stringWithUTF8String:

+ (id)stringWithUTF8String:(const char *)bytes

UTF8エンコードのC文字列をコピーして作った文字列を返します

bytes:UTF-8エンコーディングのC文字列
(NULL終端でない場合は例外が発生します)


・– writeToFile:atomically:encoding:error:

– (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error

指定したエンコードでパスのファイルに書き出します
(書き出しが正常終了するとYES、異常終了した場合はNOを返します)

path:NSStringオブジェクトを書き出すファイルのパスを指定します
(パスの中にチルダ『~』が含まれている場合、このメソッドを呼び出す前に– stringByExpandingTildeInPathで変換をかける必要があります)

useAuxiliaryFile:YESの場合、一度予備ファイルに書き出してから、本来指定したパスのファイルに書き換えます
そのため、書き出し途中にクラッシュしても元のパスのファイル内容は保証されます
NOの場合、直接指定したパスのファイルに書き出します

enc:パスの示しているファイルのエンコーディング

error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)


・CFStringConvertEncodingToNSStringEncoding

unsigned long CFStringConvertEncodingToNSStringEncoding (CFStringEncoding encoding);

Core Foundationのエンコーディング(CFStringEncoding)をCocoaエンコーディング(NSStringEncoding)に変換します

CFStringConvertNSStringEncodingToEncodingは逆にNSStringEncodingをCFStringEncodingに変換します

encoding:変換するCore Foundationの文字列エンコーディングを指定します
無効なエンコーディングを指定した場合の動作は未定義です

NSStringEncodingの定義はNSString.hで、

typedef NSUInteger NSStringEncoding;

となっており、またNSUIntegerはNSObjCRuntime.hで、

typedef unsigned long NSUInteger;

となっていますので、NSStringEncodingとCFStringEncodingは同型であることが分かります


・+ stringWithContentsOfFile:encoding:error:

+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error

指定したパスにあるファイルを読み込み、エンコードして文字列を作って返します
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)

path:ファイルの場所を示すパス
enc:パスの示しているファイルのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)


●文字の集合

// 空白を含む文字列を作成
NSString *str = @"    B W H    72 55 78    ";

// 前後の空白文字を削除
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
//    B W H     72 55 78


・– stringByTrimmingCharactersInSet:

– (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set

NSStringオブジェクトの文字列の両端から、指定した文字集合を取り除いた文字列を返します
元の文字列が除外する文字集合のみで構成されていた場合、空の文字列を返します

set:除外する文字集合(nilを指定することはできません)
文字集合にはwhitespaceCharacterSet(空白とタブ)やwhitespaceAndNewlineCharacterSet(空白とタブ、改行文字)などの標準文字集合の他、componentsSeparatedByCharactersInSet:でカスタマイズも指定できます


●文字列の走査

// テキストファイルの読み込み
NSError *fileError;
NSStringEncoding dosEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSJapanese);
NSString *dosString = [NSString stringWithContentsOfFile:@"/Users/yayoi/Desktop/chihaya.txt" encoding:dosEncoding error:&fileError];

// NSScannerのインスタンス化
NSScanner *strScanner = [NSScanner scannerWithString:dosString];

// 改行文字の集合を取得
NSCharacterSet *chrSet = [NSCharacterSet newlineCharacterSet];

// 1行ずつの読み込み処理
NSString *strLine;
while (![strScanner isAtEnd]){

// 1行読み込み
[strScanner scanUpToCharactersFromSet:chrSet intoString:&strLine];

// 行に対する処理
NSLog(strLine);

// 改行文字をスキップ
[strScanner scanCharactersFromSet:chrSet intoString:NULL];


・scannerWithString:

+ (id)scannerWithString:(NSString *)aString

指定した文字列のNSScannerオブジェクトを返します

aString:走査する文字列を指定します


・newlineCharacterSet

+ (id)newlineCharacterSet

改行文字(UnicodeのU+000A~U+000D、U+0085)を含む文字集合を返します

U+000ALFLine Feed行送り(行頭への復帰は含まない)
U+000BVTVertical Tab垂直タブ(桁位置を維持しての行送り)
U+000CFFForm Feed改ページ
U+000DCRCarriage Return行頭への復帰(行送りは含まない)
U+0085NELNext Line次行送り


・isAtEnd

- (BOOL)isAtEnd

レシーバ内の全文字を走査したかをブール値で返します

走査が完了していればYESを、そうでなければNOを返します


・scanUpToCharactersFromSet:intoString

- (BOOL)scanUpToCharactersFromSet:(NSCharacterSet *)stopSet intoString:(NSString **)stringValue

レシーバの文字列を走査し、指定した文字集合の直前までの文字列を格納します

走査が完了していればYESを、そうでなければNOを返します

charactersToBeSkipped(走査対象から除外する文字を設定する)文字集合や、空白、改行文字のみの場合はNOを返します

走査が完了すると、stringValueにNULLを送ります

走査対象の文字列にstopSetで指定した文字集合が無くなった場合は、捜査対象の残りの文字列をstringValueに送り、レシーバのscanLocation(走査位置)を文字列の最後に設定し、YESを返します

stopSet:走査の基準となる文字集合を指定します

stringValue:走査した文字列を格納するNSStringオブジェクトを指定します


・scanCharactersFromSet:intoString:

- (BOOL)scanCharactersFromSet:(NSCharacterSet *)scanSet intoString:(NSString **)stringValue


レシーバの文字列を走査し、指定した文字集合までの文字列を格納します

走査が完了していればYESを、そうでなければNOを返します

走査が完了すると、stringValueにNULLを送ります

scanSet:走査の基準となる文字集合を指定します

stringValue:走査した文字列を格納するNSStringオブジェクトを指定します


scanUpToCharactersFromSet:とscanCharactersFromSet:の違いは、stringValueに文字列を切り出す際にscanSetを含めるか否かです。

 scanUpToCharactersFromSet:scanCharactersFromSet:
stringValuescanSetを含めないscanSetを含める
scanLocationscanSetの位置scanSetの次の文字

上記のサンプルコードの場合、

1)改行文字直前までの文字列をstrLineに格納。走査位置は改行文字。

2)改行文字を含めて走査。格納せずに、走査位置は改行文字の次の文字へ移動。

を繰り返すことになります。



参考文献

CFString Reference

NSScanner Class Reference

NSCharacterSet Class Reference

HMDT/NSScanner

Wikipedia/Unicode一覧 0000-0FFF

Wikipedia/改行コード

Wikipedia/タブキー

Wikipedia/制御文字

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
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
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

Bose QuietComfort 20
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