2011年5月25日水曜日

良く使う文字列変換をまとめてみる

Objective-Cに慣れちゃったという人は読み飛ばしてください。
今回はかなりの初級編。

Excelの関数から始まり、VBAでプログラムデビューした自分にとってObj-Cの文字列変換ってどうにも親しみづらいイメージがありました。
ネットや本であれこれ調べて、最近はようやく慣れましたが。
そこで、良く使うパターンをまとめちゃいます☆


NSStringってクラスはご存知ですか?
Obj-cの文字を扱うクラスです。一度設定したら変更できないですね。

例えば。。。
NSString *str = @"str";
str = @"str2";

とかは怒られてしまいます。
なので、変更可能なクラスである NSMutableStringを個人的には多用します。
まあ、変更する必要がなければNSStringの方がプログラムの効率が良いのですがね。


文字列変換でやりたい事って、大体決まってますよね。
文字列連結に文字列置換に文字列取り出しってところでしょうか。おまけで型変換。特にC言語のStringにしたいってケースは良くあるかも。

生成を含めてズバリしたの5つ

文字列生成 > [NSMutableString stringWithFormat:str];
文字列連結 > [NSMutableString appendString:str];
文字列置換 > [NSMutableString stringByReplacingOccurrencesOfString:str1 withString:str2]
文字列取り出し > [str substringWithRange:NSMakeRange(0,1)];
UTF8に変換 > [str UTF8String];



まずは良く使う形。
NSMutableString *str1 = [NSMutableString stringWithFormat:@"SELECT * FROM TABLE WHERE id = %d",100];

stringWithFormatメソッド。これは文字列が格納された変数を生成するときによく使います。
最初の@””に囲まれた文字列が格納したい本体。%dには数字(Integerなど)を表す変数みたいなもの。
C が書ける人にはおなじみですね。
で、カンマで区切ってその「%d」の中に入れる数字が続きます。この「100」の部分は変数でもいいです。
VBのformat関数みたいなものですね。


少し発展させるとこんな感じになります。

NSString *str = [NSString stringWithFormat:@"%02d:%02d",Number/60,Number % 60];

変数Numberには数字が入っています。まあ、秒数だとしましょう。
上のコードは秒数から「00:00」に表記を変えるコードです。
%02dは二桁の数字という意味です。 1 = 01 ,11 = 11 ってな感じです。
%02dがコロンを挟んで二つならんでいると思います。そしてカンマで区切られた式が二つ。
分かりやすく構造だけ書くと下のようになります。

[NSString stringWithFormat:@"%d%d", (一つ目の%dに対応) , (二つ目の%dに対応) ];

要するに%何とかの個数が増えれば、それに対応させてカンマで区切られた値なり式が増えるんですね。
実際にSQLなんかを合成させてみるとこんな感じになります。
%dの代わりに使われている%@には文字列を格納しています。
一行目のコードで生成した文字列に appendString:メソッドで文字列を連結しています。
連結する文字列は stringWithFormat: で別途生成したも文字列になります。
末尾の NSLog関数で生成したSQLの内容をコンソールに表示させています。
NSLogの使い方は、ほぼStringWithFormatと同じ書式です。

NSMutableString *str1 = [NSMutableString stringWithFormat:@"%@",@"INSERT INTO Data1 VALUES"];
[str1 appendString:[NSMutableString stringWithFormat:@" (%d,'%@',%d,%d,%d,'%@','%@','%@');"
,[Array count]
,[Name_ stringByReplacingOccurrencesOfString:@"'" withString:@"''"]
,Number_
,info_
,SoundType_
,[soundName_ stringByReplacingOccurrencesOfString:@"'" withString:@"''"]
,infoSoundName_
,itemCode_
]];
NSLog(@"%@",str1);

文字列連結は
[NSMutableString appendString:@"文字列”]; です。
このメソッドを使うと、末尾に任意の文字列を連結できます。
 
NSMutableString *str = [NSMutableString stringWithFormat:@"今日は%d月%d日です。”,12,25];
[str appendString:@"なんだクリスマスじゃないか!”];
[str appendString:[NSMutableString stringWithFormat:@" じゃあ%d円くらいなら、おごってあげるよ。"]];

と、連結しまくりです。
上のコードでは文字列置換もやっています。痴漢じゃないですよ。置換。
この部分。
[Name_ stringByReplacingOccurrencesOfString:@"'" withString:@"''"]

Nameに含まれるシングルクォートをエスケープして['']シングルクォート二つに変更しています。
今時はみなさんCoreDataを使っているでしょうが、もしSqliteを使っているならば
生成したSQLに文字列が含まれるようなものを扱っているならば、シングルクオートをエスケープしとかないと
ユーザーがシングルクォーテーション付きの文字列を入れて登録〜っとやった瞬間にエラーぶっこきますよw

と、余談はさておき、

文字列置換は
[NSMutableString stringByReplacingOccurrencesOfString:str1 withString:str2]
となっていて、str1とstr2を入れ替えるんですね。

NSMutableString *hatugen = @"今回のプロジェクトは田中君にまかせることになった。がんばりたまえ”;

もし、田中が気に入らなくて鈴木さんに変更したいのならばこうだ。
[hatugen stringByReplacingOccurrencesOfString:@"田中” withStirng:@"鈴木"];


最後に文字列取り出し。
obj-cはVBとかエクセルの関数みたいにLeftとかMidとかじゃないんだけど、
にたようなものがあるのでそれを使う。

NSString *str = [NSString stringWithFormat:@"%02d:%02d",Second/60,Second % 60];
n1.text = [str substringWithRange:NSMakeRange(0,1)];//一文字目
n2.text = [str substringWithRange:NSMakeRange(1, 1)];//二文字目
n3.text = [str substringWithRange:NSMakeRange(3, 1)];//三文字目
n4.text=[str substringWithRange:NSMakeRange(4, 1)];//四文字目

NSMakeRange( 開始位置, 文字数) なので [str substringWithRange:メソッドを使えば、
エクセルの関数のMid(ミドル)的に取り出せる。


後は、変換した文字列の使い道としては、UILabelか UIButton かといったところでしょうか。
UILabel は Label.text = @"ラベルだどぉ";
UIButtonは [button setTitle:@"ボタンタイトルです。" forState:UIControlStateNormal];
って感じです。


今回は「良く使う文字列変換」についてでした~


0 件のコメント:

コメントを投稿