Objective-C集合(二)——集合家族



一.家族を集める
1.NSArray
NSArrayは、オブジェクトを格納するためのシーケンステーブル付きCocoaクラスです.
制限:a.Objective-Cのオブジェクトのみを格納できますが、int、float、enum、struct、またはNSArrayのランダムポインタなどのC言語の基本データ型は格納できません.
b.NSArrayにnil(オブジェクトのゼロ値またはNULL値)を格納できません.
 // arrayWithObjects NSArray, ,
	// nil ( nil )
	NSArray *array;
	array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
	// 
	- (unsigned) count;
	// 
	- (id)objectAtIndex: (unsigned int) index;
 
2.NSMutableArray:可変配列
// , , 。
	+ (id) arrayWithCapactity: (unsigned int) numItems;
	// 
	- (void) addObject: (id) anObject
	// 
	- (void)removeObjectAtIndex:(unsigned) index;
 
3.NSEnumerator(列挙)
        // 
	- (NSEnumerator *) objectNSEnumeratort;
	NSEnumerator *anumerator;
	enumerator = [array objectNSEnumerator];
	// 
	- (void)reverseObjectEnumerator;
	// while , ;
	- (id) nextObject;
	nextObject nil , 
	 :
	NSenumerator *enumerator;
	enumerator = [array objectEnumerator];
	
	id thingie;
	// , 
	while(thingie == [enumerator nextObject]){
		NSLog(@"I found %@",thingie);	
	}
 
4.クイック列挙
for(NSString *string in array){
		NSLog(@"I found %@",string);
	}
 
5.NSDictionary(ハッシュ構造)
(1)NSDictionary
               // 
		+ (id)dicationaryWithObjectsAndKeys:
					(id)firstObject,...;
		// 
		- (id) objectForKey: (id) aKey;

		 :
		Tire *t1 = [Tire new];
		Tire *t2 = [Tire new];
		Tire *t3 = [Tire new];
		Tire *t4 = [Tire new];

		NSDictionary *tires;
		tires = [NSDictionary dictionaryWithObjectsAndKeys:
				t1,@"front-left",t2,@"front-right",
				t3,@"back-left",t4,@"back-right",nil]

		Tire *tire =[tires objectForKey: @"back-right"];
 
(2)NSDictionaryは可変ではなく、NSMutableDictionaryは任意に要素を追加または削除することができる.
               // NSMutableDictionary dictionary , dictionaryWithCapacity: 
		// 
		+ (id) dicationaryWithCapacity: (unsigned int) numItems;// , 
		// 
		- (void) setObject: (id) anObject 
				forKey: (id) aKey;
		// 
		- (void) removeObjectForKey:(id)aKey;
 
基本データ型パッケージクラス
1.NSNumber
NSArrayとNSDictionaryはオブジェクトのみを格納し、基本的なタイプのデータは直接格納できませんが、オブジェクトでカプセル化してコレクションに追加できます.
CocoaはNSNumberクラスを提供して基本データ型をパッケージ化(すなわちオブジェクト形式で実装)する
a.いくつかの方法の例:
+ (NSNumber *) numberWithChar : (Char)value;
	+ (NSNumber *) numberWithInt : (Int)value;
	+ (NSNumber *) numberWithFloat : (Float)value;
	+ (NSNumber *) numberWithBool: (Bool)value;
 
b.Objective-cでは自動梱包はサポートされていません
      NSNumber *number;
	number = [NSNumber numberWithInd:42];
	[array addObject: number];
	[dictionary setObject: number forkey: @"Bork"];
 
C.基本タイプのデータをNSNumberにカプセル化すれば、次の方法で再取得できます.
       - (Char) charValue;
	-  (Int) intValue;
	- (Float) floatValue;
	- (Bool) boolValue;
	- (NSString *) stringValue
 
2.NSValue
NSNumberはNSValueのサブクラスであり、NSValueは任意の値をパッケージすることができる.
+ (NSValue *) valueWithBytes: (const void *) value
			objCType: (const void *) type;
 
クラスメソッドを使用して新しいNSValueを作成できます.
 
3.NSNull
nilは集合の終わりを表すため、近NSArray,NSDictionaryにnilを格納することはできません.
NULL値は次の方法で指定します.
+ (NSNull *)  null;
 
例:
[contact setObject: [NSNull null] forKey:@"home fax machine"];
 
アクセス方法
      id homefax;
	homefax = [contact objectForKey: @"home fax machine"];
	if(homefax == [NSNull null]){
		//no fax machine......
	}
 
二.集合総合運用小例検索ファイル
int main(int argc, Const char *argc[]){
	// 
	NSAutoreleasePool *pool;
	pool = [[NSAutoreleasePool alloc] init];
	// fileManager
	NSFileManager *defaultManager;
	defaultManager = [NSFileManager defaultManager];
	// 
	NSString *home;
	home = [@"~",stringByExpandingTildeInPath];
	// 
	NSDirectoryEnumerator *direnum;
	direnum = [manager enumeratorAtPath: home];
	// 
	NSMutableArray *files;
	files = [NSMutableArray arrayWithCapacity: 42];
	// jpg 
	NSString *filename;
	while(filename = [direnum nextObject]){
		if([[filename pathExtension] isEqualTo: @".jpg"]){
			[files addObject: fillname];
		}
	}
	// 
	NSEumerator *filenum;
	filenum = [files objectEnumerator];
	while(filename = [filenum nextObject]){
		NSLog(@"%@",filename);
	}

	[pool drain];
	return 0;
}
 
クイック反復メソッド
int main(int argc, Const char *argc[]){
	NSAutoreleasePool *pool;
	pool = [[NSAutoreleasePool alloc] init];

	NSFileManager *defaultManager;
	defaultManager = [NSFileManager defaultManager];

	NSString *home;
	home=[@"~",stringExpandingTildeInPath];

	NSMutableArray *files;
	files = [NSMutableArray arrayWithCapacity: 42];

	for(NSString *filename in [defaultManager enumeratorAtPath: home]){
		if([[filename pathExtension] isEqualTo: @".jpg"]){
			[files addObject filename];
		}
	}

	for(NSString *filename in files){
		NSLog(@"@",filename);
	}
}