2012-03-02
文字列の連結/切り出し/比較など
文字連結
ある文字列の後ろに文字列を連結するには、stringByAppendinfString:メソッドを使います。NSStringは、文字列の変更はできませんので、結合された文字列を新たに生成してそれを返します。
NSString* str1 = @"My name is..."; NSString* str2 = [str1 stringByAppendingString : @"Jiro"];
NSMutableStringの場合は、appendString:という自分自身を変更するメソッドがあります。
//NSMutableStringでの文字の連結 NSMutableString* str = @"My name is "; [str appendingString : @"Jiro"];
文字列の切り出し
文字列から指定の位置の1文字を取り出すには、characterAtIndex:メソッドを使います。
位置は先頭の文字が0で、1文字ごとに値が1ずつ増えます。
//インデックス2の場所の文字を切り出す unichar che = [@"World" characterAtIndex : 2];
文字列の比較
文字列の比較にはいくつかのメソッドがありますが、よく使われるのが同じ文字列かどうかを確認するためのisEqualToString:とソートなどのために文字列の大小比較を行うためのcompare:の2つです。
まず、同じ文字列かどうか比較から見ていきます。isEqualToString:の引数に、比較したい文字列を渡すと、同じだった場合はYES、異なる場合はNOが返ってきます。
NSString* str1 = @"iPhone"; NSString* str2 = @"iPod touch"; if ( [str1 isEqualToString: str2] == YES ) { //同じ文字列の時の処理 }
文字列が同じかどうかの比較
同じ文字列かどうかの比較というと、以下のように単純に等号で比較したくなるかもしれません。
NSString* str1 = @"iPhone"; NSString* str2 = @"iPod Touch"; if( str1 == str2 ) { //同じ文字列の時の処理 }
ただし、Objective-Cではオブジェクトはオブジェクトへのポインタですので、等号での比較はオブジェクトのアドレスの比較になり、中に格納されている値の比較にはなりません。
『同じアドレスにある全く同じオブジェクトかどうか』という意味での比較になりますので注意が必要です。
次は、大小比較のためのcompare:メソッドです。
引数には比較したい文字列を渡します。
//compare:メソッドでの文字列比較例 NSString* str1 = @"abc"; NSString* str2 = @"efd" //比較の実行 NSComparisonResult = [ str1 compare : str2]; //比較の結果による分岐 switch( result ){ case NSOrderedAscending: //str1が小さいとき break; case NSOrderdSame; //一致した時の処理 break; case NSOrderdDescending: //str1が多い時の処理 break; }
比較した結果は、NSComparisonResultという整数値で、引数で渡された相手に対して、
自分が小さい場合は、NSOrderedAscending、一致した場合はNSOrderedSame、大きい場合は、NSOrderedDescencingが返ってきます。[ str1 compare : str2 ] を見たときに、str1の方が小さい場合は、右(str1)に向かって上り坂のようになりますsので、Ascendginと考えると覚えやすいでしょう。
enum_NSComparisonResult {
NSOrderedAscending = -1 //左側の値が小さい
NSOrderedSame, //一致
NSOrderedDescending //左側の値が大きい
}
文字列の部分比較処理
文字列の先頭や松尾に特定の文字列が含まれるかを調べるメソッドも容易されています。
hasOrefix:とhasSuffi:です。
BOOL prefix = [ str hasPrefix: @"hello" ]; //helloで始まっているか BOOL suffeFix = [str hasSuffix: @"hello"]; //helloで終わっているか
数値への変換
数値から文字列への変換はstringWithFormat:メソッドで行えることは説明しました。
その逆、文字列からからすうちへの変換のためにいくつかのメソッドが用意されています。
文字列から数値への変換メソッド(NSString)
intへの変換 -(int)intVaule
NSInterherへの変換 -(NSInteger) integerValue
long longへの変換 -(long long) longlongValue
floatへの変換 -(float) floatValue
doubleへの変換 -(double) doubleVaule
次回はアプリケーションデリゲートあたりを。。。
基本的な文字列処理
Objective-Cをはてな記法でシンタックスハイライトするには"objc"を挟めばいいらしい。
文字列定数
@"文字列"
ObjctiveCでの文字列定数の書き方ですが、@を先頭に書いてその後ろに"で囲んだ文字列を書きます。
@をつけることで、NSStringクラスのインスタンスになります。
ObjectiveCはANCI-Cの上位互換ですので、@をつけないC言語の文字列もそのまま使うことができます。
文字列定数もインスタンスですので、以下のようにメソッドを呼び出すことが可能です。
NSString* str = [@"ABC" length]; //文字列数を求める
それでは、NSStringとNSMutableStringの基礎的メソッドを見ていきましょう。
文字列の文字数の取得
文字列の文字数を取得すつメソッドはlengthです。文字列のバイト数ではありませんので注意しましょう。
NSUInteger len = [@"Taro" length];
文字列の生成/コピー
文字列を生成する一番な方法は、文字列定数からNSStringを作る方法で、クラスメソッドのstringWithString:がよく使用されます。
NSString: str = [NSString stringWithString: @"hello"];
以下のように文字列定数を代入しても同じ結果が得られます。
NSString* str = @"hello"
ただし、文字列定数はNSStringですので、そのサブクラスであるNSMutableStringに代入することはできません。
そのため、必然的にstringWithString:メソッドを使うことになります。
NSMutableString* str = [NSMutableString stringWithString: @"hello"];
書式指定での文字列生成
文字列を画面に表示する際に、様々なデータを書式を指定して連結することがよくあると思います。そのためのメソッドが、クラスメソッドのstringWithFormat:です。C言語のprintfの書式指定と同様の指定で、文字列を生成することができます。単に、数字を文字列に変換する際にも使用できます。
int min = 12; NSString* str = [NSString stringWithFormat: @"Time : %d min",min];
書式指定は、C言語のprintfと同様で、%dは整数値、%fは実数値のように指定します。桁数の指定をする場合も%4dが4桁の整数値、%04dが4桁の整数値で、4桁未満の数値の場合は0を補います。
NSString* str1 = [NSString stringWithFormat: @"%4d", 12]; NSString* str1 = [NSString stringWithFormat: @"%04d", 12];
デバッグ用の文字列出力
文字列処理とは異なりますが、プログラムの実行結果を簡単に知るためにコンソールへの文字出力関数NSLogをここで紹介します。
NSLogは、stringWithFomat:メソッドと同様の書式で、結果をコンソールへ出力します。
第一引数で書式を文字列で指定し、第に引数以降で、埋め込みたい変数を指定します。
NSString* name = @"んほおおおお" NSLog( @"MY name is %@.",name);
Xcodeのメニューバーの【実行】→【コンソール】を実行すると、コンソールウィンドウが表示され、以下のようにNSLogからの出力を確認することができます。
次回は、文字列の連結/切り出し/比較などです。
