一.集合类
NSArray(不可变数组)与NSMutableArray(可变数组)
1.NSSArray
- 与c语言相比,Foundation数组的优点:1>不需要检查索引是否有效;2>长度不需要编码。
- NSArray是一个Cocoa类,用来存储对象的有序列表
- 只能用来存储oc的对象,不能存储一些像c语言中的基本数据类型,如int,float,enum,struct
- 不能在NSArray中存储nil.
- 创建数组:通过类方法arrayWithObjects:参数是以逗号分隔的对象列表,列表的结尾添加nil代表列表结束。(不能在数组中存放nil的原因之一)
- 示例:
NSArray *array;
array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];//其中nil为自带
代码功能:创建了一个由NSString字面常量对象组成的3个元素的数组。
初始化方式:
NSArray *a = [NSArray arrayWithObjects:(对象:可以是多个,之间用逗号隔开)];
例如:
NSArray *array = [NSArray arrayWithObject:@"one",@"two",@"three",nil];
新的初始化方式:
NSArray *newArray = @[@"one",@"two",@"three"];//结尾不需要nil
求数组的长度:
NSUInteger nCount = [array count];
取数组的第一个元素(对象):
NSString *firstString = [array firstObject];
取数组的最后一个对象:
id lastString = [array lastObject];//id代表万能指针,用id代表NSString.
取指定索引下的对象:
id *thirdIndexString = [array objectAtIndex:3];//数组下标从零开始,数值为3,代表索引第4个对象。
求当前对象下的索引(数组下标)的值:
NSUInteger index = [array indexOfObject:@"two"];
下面的遍历是一些枚举类型NSEnumberator的用法:
从前往后遍历数组:
NSEnumberator *enumrator = @[@"one",@"two",@"three",@"four"];
while ((str = [enumrator nextObject]) != nil){ //当遇到nil时结束遍历
NSLog(@"%@",str);
}
从后往前遍历数组:
NSEnumerator *reversEnumator = [array reverseObjectEnumerator];
while ((str = [reversEnumator nextObject]) != nil){
NSLog(@"%@",str);
}
快速枚举:
NSArray *str = @[@"one",@"two",@"three"];
for (NSString *str in array){
NSLog(@"%@",str);
}
也可以使用c风格数组的形式;来时用数组的元素:
NSArray *array = @[@"one",@"two",@"three"];
NSString *itemArray = array[0];
NSLog(@"%@",itemArray);
2.NSMutableArray
创建新的可变数组(NSMutableArray)
+(id)arrayWithCapacity:(unsigned)numItems;
NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:3];
NSLog(@”before init the marray:%@”,mArray);
给数组添加对象:
[mArray aadObjectsFromArray:@"one"];
给数组追加一个array数组:
NSArray *array = @[@"four",@"six",@"seven"];
[mArray addObjectsFromArray:array];
插入操作:
[mArray insertObject:@"three" atIndex:2];
//在指定索引后插入字符串对象
替换操作:
[mArray replaceObjectAtIndex:2 withObject:@""];//替换指定索引下的字符串
删除操作:
[mArray removeObject:@"Three"];//删除指定字符串
[mArray removeLastObeject];//删除最后一个字符串
[mArray removeObjectAtIndex:2];//删除指定索引瞎的字符串
[mArray removeAllObjects];//删除所有字符串对象
NSDictionnary与NSMutableDictionary
1.NSDictionary(字典)
是关键字及其定义的集合,又叫做散列表或者关联数组。用的是键查询优化存储方式,查询速度快
(1)创建NSDictionary对象的方法:
- +(id)dictionaryWithObjectsAndKeys:(id)firstObject,…;
- students = [NSDictionary dictionaryWithObjectAndKeys:@”zhangsan”,@”stu1”,@”lisi”,@”stu2”];
新的语法声明字典:
NSDcitionary *nameAndValues = @{
@"name1":@"zhangsan",
@"name2":@"lisi",
@"name3":@"zhaoliu"
};
(2)根据key值从字典中获取对象的方法:
- -(id)objectForKey:(id)key;
- NSString *student = [students objectForKey:@”stu2”];
(3)输出所有的键值或者输出所有的定义(值)
NSDcitionary *nameAndValues = @{
@"name1":@"zhangsan",
@"name2":@"lisi",
@"name3":@"zhaoliu"
};
NSArray *allKeys = [nameAndValues allKeys];//取出所有的键值
NSArray *values = [nameAndValues allValues];//取出所有的定义
(4)遍历字典:
遍历键值:
NSEnumerator *keyEnum = [nameAndValues keyEnumerator];
NSString *keys= nil;
while(keys = [keEnum nextObject]){
NSLog(@"%@",keys);
}
遍历定义(值):
NSEnumerator *objectEnum = [nameAndValues objectEnumerator];
NSString *object = nil;
while(object = [objectEnum nextObject]){
NSLog(@"%@",object);
}
2.NSMutableDictionary(可变字典)
注:字典的key必须是唯一的,不能出现重复的key
(1)创建NSMutableDictionary对象
- +(id)dictionaryWithCapacity:(unsigned int)numItems;
- NSMutableDictionary *mDictionary = [NSMutableDictionary dictionaryWithCapacity:3];
(2)向可变字典添加对象内容
- -(void)setObject:(id) anObject forkey:(id) key;
- [mDictionary setobject :@”wangmazi” forKey:@”name1”];
- [mDictionary setobject :@”xiaoming” forKey:@”name2”];
(3)从可变字典对象删除内容
- -(void)removeObjectForkey:(id)akey;
示例:
[mDictionary removeObjectForkey:@"name2"];//删除一个键值
NSArray *delNameKeys = @[@"name1",@"name2"];//删除一个数组的键值
[bmDictionary removeObjectsForkey:delNameKeys];
[mDictionary removeAllObjects];//删除所有的值
objective-c枚举类型
-(NSEnumerator *)objectEnumerator;得到枚举对象,从数组开始到结尾。
- (NSEnumerator *) reverseObjectEnumerator;得到枚举对象,从数组结尾到开始
- (id)nextObject;判断是否枚举结束,主要是判断下一个对象是不是nil
示例:
1.从前往后遍历数组:
NSEnumberator *enumrator = @[@"one",@"two",@"three",@"four"];
while ((str = [enumrator nextObject]) != nil){ //当遇到nil时结束遍历
NSLog(@"%@",str);
}
2.从后往前便利数组:
NSEnumerator *reversEnumator = [array reverseObjectEnumerator];
while ((str = [reversEnumator nextObject]) != nil){
NSLog(@"%@",str);
}
3.快速枚举:(重点使用)
NSArray *names = [NSArray arrayWithObjects:@"one",@"two",@"three"];
for(NSString *name in names){
NSLog(@"%@",name);
}
数值类型(NSNumber)
注:NSArray和NSDitionary 只能存储对象,而不能直接存放任何基本的数据类型,如int ,float ,struct等,由此NSNumber便接替了这个任务。
1.NSNumber可以将基本数据类型封装成对象(装箱boxing)
- +(NSNumber *)numberWithChar:(char)value;
- +(NSNumber *)numberWithInt:(int)value;
- +(NSNumber *)numberWithFloat:(float)value;
- +(NSNumber *)numberWIthBool:(BOOL)value;
装箱示例:
//如果需要将基本数据类型放到数组里,那么需要装箱过程
int myInt = 232;
NSNumber * MyIntNumber = [NSNumber numberWithInt:myInt];
//将基本数据类型添加进数组里
NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:3];
[mArray addObject:myIntNumber];
2.从NSNumber对象里获取基本数据类型(取消装箱unboxing)
- -(char)charValue;
- -(int)intValue;
- -(float)floatValue;
- -(BOOL)bollValue;
- -(NSString *)stringValue;
拆箱示例:
myINt = [myIntNumber intValue];
NSValue
注:NSNumber是NSValue的子类,NSValue可以包装任意值,比如,我们可以用NSValue将结构体放入到NSArray和NSDictionary中。
创建新的NSValue对象
+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type
:传递的第一个参数是我们要包装的数值的地址,比如是一个NSRect,第二个参数是一个字符串用来描述我们要包装的这个数值的数据类型,可以使用@encode来获取,如@encode(NSRect).
示例:
//@encode是使用OC的预处理指令,将数据类型转换为字符类型,用于描述数据的类型
NSRect rect = NSMakeRect(2,4,3,4);
NSValue *value = [NSValue valueWithBytes :&rect objCType : @encode(NSRect)];
[array addObject : value];
//从包装好的NSValue对象提取包装前的数据
//方法:-(void)getValue:(void *)value;
NSRect anotherRect = {2,3,45,5};
[value getValue:&anotherRect];
//注意OC中get方法不是表示类成员变量的返回,而是要退参,来获取值。