iOS(とOSX)の文字列はNSStringで@"...."
で表現する。基本的にObjective-Cが拡張した構文には@
が付く。C言語の構文と見分けを付きやすくするためだろうか。
NSStringの便利さはC言語の標準ライブラリであれこれやるよりは楽だけどC#やRubyと比べると少し不便な印象。あとメソッド名が長い。でもまあ慣れてくれば何とかなりそう。
ファイルパスから一番後ろの要素を取得
RubyのFile.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]];
今日の成果
ファイル名を指定して作成出来るようになりました。