Objective-Cの文字列操作あれこれ

iOS(とOSX)の文字列はNSString@"...."で表現する。基本的にObjective-Cが拡張した構文には@が付く。C言語の構文と見分けを付きやすくするためだろうか。

NSStringの便利さはC言語の標準ライブラリであれこれやるよりは楽だけどC#Rubyと比べると少し不便な印象。あとメソッド名が長い。でもまあ慣れてくれば何とかなりそう。

ファイルパスから一番後ろの要素を取得

RubyFile.basenameに相当するやつ。

NSString* str = [@"/path/to/file.c" lastPathComponent]; //=> @"file.c"

拡張子を取得

.は付かないので注意。

NSString* extension = [@"/path/to/file.c" pathExtension]; //=> @"c"

拡張子を削除

NSString* str = [@"/path/to/file.c" stringByDeletingPathExtension]; //=> @"/path/to/file"

応用1: ファイル名を抜き出して拡張子がついていなければ必ず付ける

ofrubyで使ったコード。ユーザーの入力に対して常に拡張子を付けて生成したい。file.c.cとかならないように一旦拡張子を削除してから再度付けている。

// Remove a directory path and Add the ".rb" extension.
NSString* str = [[[@"/path/to/file" lastPathComponent] stringByDeletingPathExtension] stringByAppendingString:@".c"]; //=> @"file.c"
NSString* str2 = [[[@"/path/to/file.c" lastPathComponent] stringByDeletingPathExtension] stringByAppendingString:@".c"]; //=> @"file.c"

応用2: 渡されたパスをファイル名と拡張子に分解する

objective c - pathForResource? without using extension (Iphone) - Stack Overflow

NSBundleのpathForResourceにアクセスする時は(何故か)ファイル名と拡張子を別々に指定しないといけない。で、ofType(拡張子)を使わずに指定する方法はないか?っていう質問に返ってきたのがこれ。まあ確かにそうなんだけど出来れば分けずに指定するAPIが欲しいところ。

NSString* fullFileName = @"image.jpg";
NSString* fileName = [[fullFileName lastPathComponent] stringByDeletingPathExtension];
NSString* extension = [fullFileName pathExtension];

[[NSBundle mainBundle] pathForResource:fileName ofType:extension]];

今日の成果

ファイル名を指定して作成出来るようになりました。

f:id:tuto0621:20140812110705p:plain

f:id:tuto0621:20140812110711p:plain

f:id:tuto0621:20140812110717p:plain

f:id:tuto0621:20140812110723p:plain