32
第7回 iPhone輪講

Cocoa Pro07

Embed Size (px)

Citation preview

Page 1: Cocoa Pro07

第7回iPhone輪講

Page 2: Cocoa Pro07

Lesson14コレクション

Page 3: Cocoa Pro07

配列

NSArrayとNSMutableArrayCocoaのオブジェクトを入れておくために設計された配列のクラスNSStringのとき同様に2つあるのは,固定長と可変長のもの

NSArray

NSMutableArray

NSObject

Page 4: Cocoa Pro07

配列の作成

1個のオブジェクトを指定して作成

NSArray+ (id)arrayWithObject:(id)objectオブジェクトobjectを指定してインスタンスを作成します

Page 5: Cocoa Pro07

配列の作成

複数のオブジェクトを指定して作成

メソッド名の最後にsがある事に注意複数指定した引数の最後には必ずnilを指定する

NSArray

+ (id)arrayWithObjects:(id)firstObj, ...- (id)initWithObjects:(id)firstObj, ...

複数のオブジェクトを指定してインスタンスを作成.引数の最後にはnilを指定.

Page 6: Cocoa Pro07

配列の大きさ

配列の大きさを調べる

出力結果はcount is 3となる

NSArray- (unsigned)count配列に含まれる要素の数を取得します

Page 7: Cocoa Pro07

インデックスを指定したオブジェクトの取得

インデックスを指定して取り出すC言語の配列でc = names[o];のように,インデックスを指定してオブジェクトを取り出せたNSArrayでもobjectAtindex:というメソッドで取り出せる

Page 8: Cocoa Pro07

インデックスを指定したオブジェクトの取得

thirdObjectは”C”となるインデックスが配列の大きさを超えないようにする事もし超えると例外が発生する

NSArray- (id)objectAtIndex:(unsigned)indexインデックスindexを指定して要素を取得します

Page 9: Cocoa Pro07

インデックスを指定したオブジェクトの取得

objectAtIndex:でアクセスする前にcountを使って配列の大きさをチェックする2より大きいか調べる

for文を利用すれば,配列中のすべてのオブジェクトにアクセスする事ができる

Page 10: Cocoa Pro07

NSEnumeratorを使ったオブジェクトの取得

すべてのオブジェクトにアクセスするために列挙子と呼ばれる考え方があるインデックスを使ってアクセスする場合0番目,1番目,2番目…とオブジェクトにアクセスするまず先頭があって,その先頭から何番目という事でオブジェクトをしていしている

…0

12

n

Page 11: Cocoa Pro07

NSEnumeratorを使ったオブジェクトの取得

列挙子は,まず先頭のオブジェクトを取り出すそしてそのオブジェクトから「その次」のオブジェクトを取り出すさらにその次,その次…と繰り返して行く最後のオブジェクトに到達したら,その次としてnilを返す

… nil

Page 12: Cocoa Pro07

NSEnumeratorを使ったオブジェクトの取得

Cocoaで列挙子を実現するクラスはNSEnumeratorここで提供するメソッドは,「その次」のオブジェクトを取り出すものnextObjectというメソッド

NSObject

NSEnumerator

Page 13: Cocoa Pro07

NSEnumeratorを使ったオブジェクトの取得

NSEnumeratorを取得したら,このメソッドを呼び続けるそれですべてのオブジェクトを取り出せる

これでNSEnumeratorのインスタンスを取得できる

NSEnumerator- (id)nextObject

現在のオブジェクトの次のオブジェクトを取得する

NSArray- (NSEnumerator*)objectEnumerator

列挙子を取得する

Page 14: Cocoa Pro07

NSEnumeratorを使ったオブジェクトの取得

nextObjectメソッドを使いオブジェクトを取り出し,それをstringに代入しているそのstringに何か値が入っていればループは続き,最後のオブジェクトでnilが返ってくればループは終了する

Page 15: Cocoa Pro07

高速列挙を使ったオブジェクトの取得

高速列挙(Fast Enumeration)Objective-C 2.0から追加されたオブジェクトの集合にアクセスするための新しい文法

for文に対して拡張が行われていて,直接配列にアクセスできる文法は for (変数宣言 in オブジェクトの集合) { ... }オブジェクトの集合としては,NSArrayなどが指定できる

Page 16: Cocoa Pro07

オブジェクトの追加と削除

空の配列を作成空の配列を作っておいて,後から尾bジェクトを追加する事もできるこの場合は可変長のNSMutableArrayを使う

NSArray+ (id)array

中身が空のインスタンスを作成する

Page 17: Cocoa Pro07

オブジェクトの追加

オブジェクトを追加するためのメソッドは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に含まれているオブジェクトと交換します

Page 18: Cocoa Pro07

オブジェクトの削除

「同じ値」はオブジェクトは別で,持っている値が同じもの「同じオブジェクト」はオブジェクトを参照しているという事

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に含まれるオブジェクトと同じ値を持つものをすべて削除します

Page 19: Cocoa Pro07

辞書

辞書とは

「左が項目,右がその説明」こういう構造がプログラミングでは提供されており,辞書または連想配列と呼ばれているこのとき指定するオブジェクトの事をキー,関連づけられたオブジェクトの事を値と呼ぶ例であれば”CPU”がキーで,”Intel Core 2 Duo”が値になる

“CPU” => “Intel Core 2 Duo”“Memory” => “2GB”“Color” => “Black”

Page 20: Cocoa Pro07

NSDictionaryNSMutableDictionary

Cocoaで辞書を実現するのはNSDictionaryと,NSMutableDictionaryというクラス

NSDictionaryは変更できない辞書,NSMutableDictionaryは変更できる辞書

NSDictionary

NSMutableDictionary

NSObject

Page 21: Cocoa Pro07

NSDictionaryの作成

1つのキーペアと値ペアを指定して作成

NSDictionary+ (id)dictionaryWithObject:(id)object forkey:(id)key

値objectとキーkeyを指定して,インスタンスを作成する

Page 22: Cocoa Pro07

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にする

Page 23: Cocoa Pro07

キーと値の取得

キーを指定して値を取得辞書を引くにはキーを指定して,値を取り出さないといけないobjectForKey:というメソッドを使う

NSDictionary- (id)objectForKey:(id)key

キーkeyを指定して,関連づけられている値を取得する.対応する値が無い場合はnilを返す

Page 24: Cocoa Pro07

キーと値の取得

すべてのキー,値を取得辞書に含まれるすべてのキーと値を取得する事もできる

NSDictionary

- (NSArray*)allKeys

すべてのキーを配列の形で取得する

- (NSEnumerator*)keyEnumerator

すべてのキーにアクセスする列挙子を取得する

- (NSArray*)allValues

すべての値を配列の形で取得する

- (NSEnumerator*)objectEnumerator

すべての値にアクセスする列挙子を取得する

Page 25: Cocoa Pro07

キーと値の追加と削除

空の辞書を作成dictionaryというメソッドを使うメソッド自体はNSDictionaryで宣言されている

NSDictionary+ (id)dictionary

中身が空の辞書を作成する

Page 26: Cocoa Pro07

キーと値の追加と削除

キーと値のペアを追加キーを追加するにはsetObject:forKey:というメソッドを使う

どちらの値もnilにならないように注意するもし指定したキーがすでに辞書に含まれていたら上書きされる前の値は削除され,新しい値が設定される

NSMutableDictionary- (void)setObject:(id)Object forKey:(id)key

値objectとキーkeyのペアをインスタンスに追加する

Page 27: Cocoa Pro07

キーと値の追加と削除

キーと値のペアを削除追加したオブジェクトを削除するのは以下のメソッド

NSMutableArray- (void)removeAllobjectsすべてのキーと値のペアを削除する- (void)removeObjectForKey:(id)keyキーkeyと,それに関連づけられているオブジェクトを削除する- (void)removeObjectForKey:(NSArray*)keyArrayキーの配列keyArrayと,それに含まれているキーに関連づけられているオブジェクトを削除する

Page 28: Cocoa Pro07

ラッパークラス

ラッパークラスとはNSArrayやNSDictionaryに入れる事ができるのはオブジェクトになる整数や小数や論理値いった数値は,intやfloatやboolといった基本型を使うオブジェクトではない

ラッパークラスはこれらの基本型を包んでオブジェクトとして扱えるようにするためのクラス

Page 29: Cocoa Pro07

NSNumberCocoaで提供されているラッパークラスはNSNumber

NSNumerにたいする操作は2つだけで事足りる基本型からインスタンスを作るインスタンスから基本型の値を取り出す事

NSValue

NSNumber

NSObject

Page 30: Cocoa Pro07

基本型からインスタンスを作るメソッド

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を指定してインスタンスを作成する

Page 31: Cocoa Pro07

基本型からインスタンスを作るメソッド

NSNumber

+ (id)numberWithFloat:(float)value- (id)initWithFloat:(float)value+ (id)numberWithDouble:(double)value- (id)initWithDouble:(double)value

小数型の値valueを指定してインスタンスを作成する

Page 32: Cocoa Pro07

値を取り出すメソッド

NSNumber- (BOOL)boolValue論理値の値を取得します- (char)charValue- (unsigned char)unsignedCharValue文字型の値を取得します- (int) intValue- (unsgned int)unsignedIntValue- (long)longValue- (unsigned long)unsignedLongValue整数型の値を取得します- (float)floatValue- (double)doubleValue小数型の値を取得します

- (NSString*)stringValue値を文字列にしたものを取得します