第7回
iPhone輪講
Lesson14
コレクション
配列
NSArrayとNSMutableArray
Cocoaのオブジェクトを入れておくために設計された配列のクラス
NSStringのとき同様に2つあるのは,固定長と可変長のもの
NSArray
NSMutableArray
NSObject
配列の作成
1個のオブジェクトを指定して作成
NSArray
+ (id)arrayWithObject:(id)object
オブジェクトobjectを指定してインスタンスを作成します
配列の作成
複数のオブジェクトを指定して作成
メソッド名の最後にsがある事に注意
複数指定した引数の最後には必ずnilを指定する
NSArray
+ (id)arrayWithObjects:(id)firstObj, ...
- (id)initWithObjects:(id)firstObj, ...
複数のオブジェクトを指定してインスタンスを作成.引数の最後にはnilを指定.
配列の大きさ
配列の大きさを調べる
出力結果はcount is 3となる
NSArray
- (unsigned)count
配列に含まれる要素の数を取得します
インデックスを指定した
オブジェクトの取得
インデックスを指定して取り出す
C言語の配列でc = names[o];のように,インデックスを指定して
オブジェクトを取り出せた
NSArrayでもobjectAtindex:というメソッドで取り出せる
インデックスを指定した
オブジェクトの取得
thirdObjectは C となる
インデックスが配列の大きさを超えないようにする事
もし超えると例外が発生する
NSArray
- (id)objectAtIndex:(unsigned)index
インデックスindexを指定して要素を取得します
インデックスを指定した
オブジェクトの取得
objectAtIndex:でアクセスする前にcountを使って配列の大きさをチェック
する
2より大きいか調べる
for文を利用すれば,配列中のすべてのオブジェクトにアクセスする事が
できる
NSEnumeratorを使った
オブジェクトの取得
すべてのオブジェクトにアクセスするために
列挙子と呼ばれる考え方がある
インデックスを使ってアクセスする場合0番目,1番目,2番目…と
オブジェクトにアクセスする
まず先頭があって,その先頭から何番目という事でオブジェクトを
していしている
…
0
1
2
n
NSEnumeratorを使った
オブジェクトの取得
列挙子は,まず先頭のオブジェクトを取り出す
そしてそのオブジェクトから「その次」のオブジェクトを取り出す
さらにその次,その次…と繰り返して行く
最後のオブジェクトに到達したら,その次としてnilを返す
… nil
NSEnumeratorを使った
オブジェクトの取得
Cocoaで列挙子を実現するクラスはNSEnumerator
ここで提供するメソッドは,「その次」のオブジェクトを取り出すもの
nextObjectというメソッド
NSObject
NSEnumerator
NSEnumeratorを使った
オブジェクトの取得
NSEnumeratorを取得したら,このメソッドを呼び続ける
それですべてのオブジェクトを取り出せる
これでNSEnumeratorのインスタンスを取得できる
NSEnumerator
- (id)nextObject
現在のオブジェクトの次のオブジェクトを取得する
NSArray
- (NSEnumerator*)objectEnumerator
列挙子を取得する
NSEnumeratorを使った
オブジェクトの取得
nextObjectメソッドを使いオブジェクトを取り出し,それをstringに
代入している
そのstringに何か値が入っていればループは続き,最後のオブジェクトで
nilが返ってくればループは終了する
高速列挙を使った
オブジェクトの取得
高速列挙(Fast Enumeration)
Objective-C 2.0から追加されたオブジェクトの集合にアクセスするための
新しい文法
for文に対して拡張が行われていて,直接配列にアクセスできる
文法は for (変数宣言 in オブジェクトの集合) {
...
}
オブジェクトの集合としては,NSArrayなどが指定できる
オブジェクトの追加と削除
空の配列を作成
空の配列を作っておいて,後から尾bジェクトを追加する事もできる
この場合は可変長のNSMutableArrayを使う
NSArray
+ (id)array
中身が空のインスタンスを作成する
オブジェクトの追加
オブジェクトを追加するためのメソッドは
NSMutableArrayで定義される
NSMutableArray
- (void)addObject:(id)object
オブジェクトobjectを追加します
- (void)addObjectFormArray:(NSArray*)array
配列arrayに含まれるすべてのオブジェクトを追加します
- (void)insertObject:(id)object atIndex:(unsigned)index
オブジェクトobjectをインデックスindexに追加します
- (void)replaceObjectAtIndex:(unsigned)index; withObject:(id)object
インデックスindexにあるオブジェクトをオブジェクトobjectと置換します
- (void)setArray:(NSArray*)array
すべてのオブジェクトを配列arrayに含まれているオブジェクトと交換します
オブジェクトの削除
「同じ値」はオブジェクトは別で,持っている値が同じもの
「同じオブジェクト」はオブジェクトを参照しているという事
NSMutableArray
- (void)removeAllObject
すべてのオブジェクトを削除します
- (void)removeLastObject
最後のオブジェクトを削除します
- (void)removeObjectAtIndex:(unsigned)index
インデックスindexにあるオブジェクトを削除します
- (void)removeObject:(id)object
配列に含まれるオブジェクトで,オブジェクトobjectと同じ値を持つものすべて削除します
- (void)removeObjectIdenticalTo:(id)object
配列に含まれるオブジェクトで,オブジェクトobjectと同じものすべてを削除します
- (void)removeObjectsInArray:(NSArray*)array
配列に含まれるオブジェクトで,配列arrayに含まれるオブジェクトと同じ値を持つものをすべて削除します
辞書
辞書とは
「左が項目,右がその説明」こういう構造がプログラミングでは提供されて
おり,辞書または連想配列と呼ばれている
このとき指定するオブジェクトの事をキー,関連づけられたオブジェクトの
事を値と呼ぶ
例であれば CPU がキーで, Intel Core 2 Duo が値になる
CPU => Intel Core 2 Duo
Memory => 2GB
Color => Black
NSDictionary
NSMutableDictionary
Cocoaで辞書を実現するのはNSDictionaryと,
NSMutableDictionaryというクラス
NSDictionaryは変更できない辞書,NSMutableDictionaryは変更できる辞書
NSDictionary
NSMutable
Dictionary
NSObject
NSDictionaryの作成
1つのキーペアと値ペアを指定して作成
NSDictionary
+ (id)dictionaryWithObject:(id)object forkey:(id)key
値objectとキーkeyを指定して,インスタンスを作成する
NSDictionaryの作成
複数のキーと値のペアを指定して作成
1つ目は配列を使う方法
キーの配列と値の配列を別個に作成し,辞書を作る
2つ目は可変引数を使う方法
このメソッドでは値1,キー1,値2,キー2,...というように値とキーのペ
アをどんどん並べて行く.最後の値としてnilを指定する
NSDictionary
+ (id)dictionaryWithObjects:(NSArray*)object forKeys:(NSArray*)keys
- (id)initWithObjects:(NSArray*)objects forKeys:(NSArray*)keys
値の配列objectsとキーの配列keysを指定して,インスタンスを作成する
+ (id)dictionaryWithObjectsAndKeys:(id)firstObj, ...
- (id)initWithObjectsAndKeys:(id)firstObj, ...
値とキーのペアを複数指定して,インスタンスを作成する.最後の引数はnilにする
キーと値の取得
キーを指定して値を取得
辞書を引くにはキーを指定して,値を取り出さないといけない
objectForKey:というメソッドを使う
NSDictionary
- (id)objectForKey:(id)key
キーkeyを指定して,関連づけられている値を取得する.対応する値が無い場合はnilを返す
キーと値の取得
すべてのキー,値を取得
辞書に含まれるすべてのキーと値を取得する事もできる
NSDictionary
- (NSArray*)allKeys
すべてのキーを配列の形で取得する
- (NSEnumerator*)keyEnumerator
すべてのキーにアクセスする列挙子を取得する
- (NSArray*)allValues
すべての値を配列の形で取得する
- (NSEnumerator*)objectEnumerator
すべての値にアクセスする列挙子を取得する
キーと値の追加と削除
空の辞書を作成
dictionaryというメソッドを使う
メソッド自体はNSDictionaryで宣言されている
NSDictionary
+ (id)dictionary
中身が空の辞書を作成する
キーと値の追加と削除
キーと値のペアを追加
キーを追加するにはsetObject:forKey:というメソッドを使う
どちらの値もnilにならないように注意する
もし指定したキーがすでに辞書に含まれていたら上書きされる
前の値は削除され,新しい値が設定される
NSMutableDictionary
- (void)setObject:(id)Object forKey:(id)key
値objectとキーkeyのペアをインスタンスに追加する
キーと値の追加と削除
キーと値のペアを削除
追加したオブジェクトを削除するのは以下のメソッド
NSMutableArray
- (void)removeAllobjects
すべてのキーと値のペアを削除する
- (void)removeObjectForKey:(id)key
キーkeyと,それに関連づけられているオブジェクトを削除する
- (void)removeObjectForKey:(NSArray*)keyArray
キーの配列keyArrayと,それに含まれているキーに関連づけられているオブジェクトを削除する
ラッパークラス
ラッパークラスとは
NSArrayやNSDictionaryに入れる事ができるのはオブジェクトになる
整数や小数や論理値いった数値は,intやfloatやboolといった基本型を使う
オブジェクトではない
ラッパークラスはこれらの基本型を包んでオブジェクトとして扱えるように
するためのクラス
NSNumber
Cocoaで提供されているラッパークラスは
NSNumber
NSNumerにたいする操作は2つだけで事足りる
基本型からインスタンスを作る
インスタンスから基本型の値を取り出す事
NSValue
NSNumber
NSObject
基本型からインスタンスを作る
メソッド
NSNumber
- (id)numberWithBool:(BOOL)value
- (id)initWithBool:(BOOL)value
論理値の型の値valueを指定して,インスタンスを作成する
+ (id)numberWithChar:(char)value
- (id)initWithChar:(char)value
+ (id)numberWithUnsignedChar:(unsigned char)value
- (id)initWithUnsignedChar:(unsigned char)value
文字型の値valueを指定して,インスタンスを作成する
+ (id)numberWithInt:(int)value
- (id)initWithInt:(int)value
+ (id)numberWithUnsignedInt:(unsigned int)value
- (id)initWithUnsignedInt:(unsigned int)value
+ (id)numberWithLong:(long)value
- (id)initWithLong:(long)value
+ (id)numberWithUnsignedLong:(unsigned long)value
- (id)initWithUnsignedLong:(unsigned long)value
整数型の値valueを指定してインスタンスを作成する
基本型からインスタンスを作る
メソッド
NSNumber
+ (id)numberWithFloat:(float)value
- (id)initWithFloat:(float)value
+ (id)numberWithDouble:(double)value
- (id)initWithDouble:(double)value
小数型の値valueを指定してインスタンスを作成する
値を取り出すメソッド
NSNumber
- (BOOL)boolValue
論理値の値を取得します
- (char)charValue
- (unsigned char)unsignedCharValue
文字型の値を取得します
- (int) intValue
- (unsgned int)unsignedIntValue
- (long)longValue
- (unsigned long)unsignedLongValue
整数型の値を取得します
- (float)floatValue
- (double)doubleValue
小数型の値を取得します
- (NSString*)stringValue
値を文字列にしたものを取得します

Cocoa Pro07