黑马程序员-10Foundation框架(下)

本文详细介绍了iOS开发中常用的几种集合类,包括NSMutableArray、NSSet、NSMutableDictionary等,并提供了丰富的示例代码,帮助读者理解如何在Objective-C中有效使用这些集合类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- <a href="http://www.itheima.com" target="blank">ios培训</a>、<a href="http://www.itheima.com" target="blank">ios培训</a>、期待与您交流! ----------

(2)NSMutableArray

     NSMutableArray是可变的数组,它继承自NSArray

     NSMutableArray常用的操作有:

  创建一个可变数组:要以nil结束

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil ]; 

   向数组中添加元素:

NSMutableArray *array = [NSMutableArray array];  
[array addObject:[[Person alloc] init]];     
[array addObject:@"jack"];  

   注意不能添加nil值的元素,因为nil是数组结束的标识。

[array addObject:nil]; // 错误写法 

   删除所有元素

[array removeAllObjects];

   删除最后一个元素

[array removeLastObject];

   删除指定的对象  

[array removeObject:@"jack"];  

   按照索引删除元素:

[array removeObjectAtIndex:0];  

   注意:@[] 只创建不可变数组 ,

   例如:

NSMutableArray *array = @[@"jack", @"rose"]; //错误写法

   右边产生了一个NSArray对象,因此会产生类型不匹配的警告:

Incompatible pointer types initializing 'NSMutableArray *' with an expression of type 'NSArray *'

NSSetNSMutableSet

(1)NSSet

   NSSet也是一种集合类,

   它与NSArray最大的区别就是:

   NSArray中的元素是有顺序的,因此NSArray中有索引的概念

   NSSet中的元素是没有顺序的。

  创建一个NSSet

NSSet *s = [NSSet set]; // 永远为空的NSSet     
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];  

   取出一个元素:

   随机拿出一个元素  

NSString *str =  [s2 anyObject];     
NSLog(@"%@", str);  

(2)NSMutableSet

    创建NSMutableSet对象

NSMutableSet *s = [NSmutableSet set];

添加元素  

[s addObject:@"hack"];

删除元素

[s removeObject:(id)]; //删除特定元素
[s removeAllObject];//删除所有元素

NSSetNSArray的对比

 1> 共同点

 * 都是集合,都能存放多个OC对象

 * 只能存放OC对象,不能存放非OC对象类型(基本数据类型:intcharfloat等,结构体,枚举)

 * 本身都不可变,都有一个可变的子类

 2> 不同点

 * NSArray有顺序,NSSet没有顺序

 

NSDictionaryNSMutableDictionary

NSDictionary常被成为字典,存的都是键值对(不可变)

字典  

     key ----> value

     索引 ----> 文字内容

创建一个NSDictionary对象

键值对key@"name"@"jack"

方法一: 

方法:dictionaryWithObject:  forKey:
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];  

方式二:

有多个键值对时,可以用两个数组分别存放keysvalues

利用方法:dictionaryWithObjects:  forKeys:

示例

NSArray *keys = @[@"name", @"address"];  
NSArray *objs = @[@"jack", @"北京"];  
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];  

方式三:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"jack", @"name", @"北京", @"address", @"123456", @"QQ", nil nil]; // 注意添加结束标识nil  

利用Xcode编译器特性,快速创建:@{}

示例;

NSDictionary *dict = @{@"name":@"jack", @"address":@"北京"};  

取出一个元素

id obj = [dict objectForKey:@“name”];//取出name对应的值
NSLog(@"%@", obj); // jack  
 

利用编译器特性,取出元素:对象名[key]

obj = dict[@“name”];      
NSLog(@"%@", obj); // jack

返回键值对的个数对象名.count

NSLog(@"%ld", dict.count); 

注意:

字典不允许有相同的key,但允许有相同的valueObject

典的无序的

NSMutableDictionary(可变)

创建一个NSMutableDictionary

NSMutableDictionary *dict = [NSMutableDictionary dictionary];  

添加键值对:setObject方法

// 添加键值对  

[dict setObject:@"jack" forKey:@"name"];  
[dict setObject:@"北京" forKey:@"address"];

注意:给存在的key赋值,旧值被覆盖

// 给相同的key赋值时 旧值会覆盖  

[dict setObject:@"rose" forKey:@"name"];  //此时的name为rose;

移除键值对:

[dict removeObjectsForKeys:@"name"]; 

数组和字典的打印:

NSLog(@"%@", @[@"jack",@"rose"]);  // 数组  
NSLog(@“%@“,dict}); //字典  

输出的结果是:

(  
    jack,  
    rose  
)  
{  
    address = "\U5317\U4eac";  
    name = jack;  
} 

@{}创建的时不可变的字典

//错误写法
NSMutableDictionary *dict = @{@"name":@"jack"}; 

NSDictionary 的遍历

NSDictionary *dict = @{@"name":@"jack",  
                       @"address":@"北京",  
                       @“qq”:@“888888”}; 

方法一:比较繁琐,依次取出keyvalue 

NSArray *keys = [dict allKeys];  
for (int i = 0; i <  dict.count; i++)  
{  
    id key = keys[i];  
    id obj = dict[key];  
      
    NSLog(@"%@ = %@", key, obj);  
}


方法二:利用block

int i = 0;
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {  
    NSLog(@"%@ = %@", key, obj);  
/*可以停止打印
    if(i == 1)
{*stop = YES;}
*/
}]; 

字典的数组

NSArray *persons = @[
    @{@"name" : @"jack", @"qq" : @"432423423",},
    @{@"name" : @"rose", @"qq" : @"767567"},
    @{@"name" : @"jim", @"qq" : @"423423"},
    @{@"name" : @"jake", @"qq" : @"123123213"}
    ];

取出其中的某个字典

NSDictionary *jim = persons[2];
NSLof(@“%@”,jim);

先取出1位置对应的字典,再取出字典中qq这个key对应的数据

NSLog(@"%@", persons[1][@"qq"]);

对集合的总结:

集合:

1.NSArray\NSMutableArray

*有序

*快速创建(不可变)@[obj1, obj2, obj3];

*快速访问元素:数组名[i]

2.NSSet\NSMutableSet

*无序

*无快速创建的方法

3.NSDictionary\NSMutableDictionary

*无序

*快速创建(不可变)@{key1value1, key2:value2};

*快速访问元素:字典名[key];

NSNumberNSValue

使用NSNumberNSValue来包装基本数据类型,让它们转换为对象类型的数据。

NSNumber

BOOLcharintfloatdoubleNSInteger类型的数据包装成NSNumber类型的对象

示例 

NSNumber *c = [NSNumber numberWithChar:'A'];  
NSNumber *i = [NSNumber numberWithInt:10];  

将对象转成基本类型

[c charValue];
[i intValue];

将基本类型转成字符串

NSString *str = [NSString stringWithFormat:@“%d”,a]

将字符串转成基本类型

[str intValue];

利用编译器特性:

NSNumber *c = @'A'; // 将A包装成对象  
NSNumber *i = @10; // 将10包装成对象 

不仅仅如此,还可以这样包装数据:

age变量包装成NSNumber

int age = 10;  
NSNumber *na = @(age); 

NSNumber类型的分析:

NSNumber之所以能包装数据,是因为继承了NSValue 

NSNumber只能包装数字类型,若要包装结构体就得使用NSValue

使用NSValue将结构体包装成NSValue类型的OC对象:

将结构体包装成OC对象  

CGPoint p = CGPointMake(10, 10); <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

// 将结构体转为NSValue  

NSValue *value = [NSValue valueWithPoint:p];  

value转为对应的结构体

[value pointValue];


NSDate

创建一个时间对象:当前时间

NSDate *date = [NSDate date]; // 默认依据当前时间 <span style="font-family: 宋体; background-color: rgb(255, 255, 255);"> </span>

打印时间:

NSLog(@"%@", date);//打印的为0时区时间(北京-8区) 

创建一个时间对象:比date5秒钟

NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];  

获取从197011日凌晨走过的秒数:

NSTimeInterval seconds = [date2 timeIntervalSince1970]; // 为double类型

获取date与当前时间的间隔:单位:秒

[date2 timeIntervalSinceNow];

日期格式化类的使用:

使用一:将date对象转为字符串:

void dateToString()  
{  
    NSDate *date = [NSDate date];  
      
    // 日期格式化类  
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
    // H(24小时制) h(12小时制)  
    // y 年  M 月  d 日
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";  
    NSString *strDate = [formatter stringFromDate:date];  
    NSLog(@"%@", strDate);  
}  

 

使用二:将字符串转为日期:

void stringToDate()  
{  
    NSString *time = @"2011/09/10 18:56";  
      
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
    formatter.dateFormat = @"yyyy/MM/dd HH:mm";  
      
    NSDate *date = [formatter dateFromString:time];  
      
    NSLog(@"%@", date);  
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值