Foundation框架—NSArray、NSSet、NSDictionary、NSNumber、NSDate、NSValue

---NSArray


NSArray:OC数组,它不能存放空值(nil或者0)只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等

1.NSArray的基本操作

1>最简单数组对象的建立

  NSArray *array = [NSArray array];// 这个array永远是空数组

2>一般数组的建立

  传入单个元素:NSArray *array2 = [NSArray arrayWithObject:@"jack"]; 

  传入多个元素:NSArray *array3 = [NSArray arrayWithObjects:@"jack", 
   @"rose",person, nil]; // nil是数组元素结束的标记,在多个元素的情况下如果不加入nil这   
  个元素会报错,并且非最后一个元素不能是nil,否则会提前结束

3>快速创建一个NSArray对象 
  NSArray *array4 = @[@"jack", @"rose", @"4324324"];

4>输出NSArray的元素个数

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

5>NSArray中元素的访问

  NSLog(@"%@", [array3 objectAtIndex:1]);

  NSLog(@"%@", array3[1]); // 如同C中的数组访问

2.数组的遍历


1>for (int i = 0; i<array.count; i++)
        {
            NSLog(@"%@", array[i]);
        }


2>    int i = 0;
      for (id obj in array)//id obj代表着数组中的每一个元素
        {
           NSUInteger i = [array indexOfObject:obj];// 找出obj元素在数组中的位置
           NSLog(@"%ld - %@", i, obj);
           i++;
           //下面4行代码可以设置停止遍历的条件      
           //if (i==1)
           //{
           // break;
           //}
         }
3>
    // 每遍历到一个元素,就会调用一次block,并且当前元素和索引位置当做参数传给block
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
     {
         NSLog(@"%ld - %@", idx, obj);
         if (idx == 0) // 可以设置停止遍历的条件
         {// 停止遍历
          *stop= YES;
          }    
     }];


block遍历的原理:


void ^(myblock)(id, NSUInteger, BOOL *) =
^(id obj, NSUInteger idx, BOOL *stop)
{
            NSLog(@"%ld - %@", idx, obj);
           if (idx == 0)
           {
                // 停止遍历
                *stop = YES;
            }
};
for (int i = 0; i<array.count; i++) // block会在内部生成一个for循环
{        // 用来标记是否需要停止遍历
         BOOL isStop = NO;
         // 取出元素
         id obj = array[i];   
         myblock(obj, i, &isStop);   
         if (isStop)
         {
             break;
         }
}

---NSMutableArryy

NSMutableArryy: 可变数组,是NSArry的子类,可以用特定的方法对其做一些修改

1.创建可变数组

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


2.添加元素

[array addObject:[[Person alloc] init]];  

[array addObject:@"jack"];

3.删除元素

[array removeAllObjects];

[array removeObject:@"jack"]; // 删除指定的对象

[array removeObjectAtIndex:0]; // 按照序号删除对象

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

错误写法:
NSMutableArray *array = @[@"jack", @"rose"]; // 注意:@[ ] 只创建不可变数组

---NSSet

NSSet:是一种没有顺序的特殊的数组。

1.创建一个NSSet对象

NSSet *s = [NSSet set];

NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];

2.随机拿出一个元素

NSString *str =  [s2 anyObject];

3.输出元素个数

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

---NSMutableSet

NSMutableSet:可变的NSSet

1.创建NSMutableSet

NSMutableSet *s = [NSMutableSet set];

2.添加元素

[s addObject:@"hack"]; 

3.删除元素

[s removeObject:(id)];

---NSSet和NSArray的对比

共同点:
1>都是集合,都能存放多个OC对象

2>只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)

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

不同点:

NSArray有顺序,NSSet没有顺序

---NSDictionary

NSDictionary:字典。如同字典一样知道目录就可以找到相应的内容。里面放的是键值。key是索引,value是对应的值。字典是无序的,字典不允许有相同的key,但允许有相同的value(Object)
key ----> value
索引 ----> 文字内容

1.创建一对键值的字典

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

2.创建多个键值
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];

3.一次性创建多个键值
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"北京", @"address",
@"32423434",@"qq", nil ];

4.快速创建    

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

5.根据键找到值  

id obj = [dict objectForKey:@"name"];
id obj = dict[@"name"]; // 和上一行代码一样

NSLog(@"%@", obj);

6.返回的键值对的个数

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

7.遍历字典

NSArray *keys = [dict allKeys];
      for (int i = 0; i<dict.count; i++)
        {
            NSString *key = keys[i];
            NSString *object = dict[key];
            NSLog(@"%@ = %@", key, object);
        }
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
         NSLog(@"%@ - %@", key, obj);
         *stop = YES;
     }];
}

---NSMutableDictionary

NSMutableDictionary:可变字典

1.创建可变的字典

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

2.添加键值对

[dict setObject:@"jack" forKey:@"name"];

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

3.移除键值对

[dict removeObjectForKey:<#(id)#>];   

NSLog(@"%@", dict);

4.数组与字典的混合使用

NSArray *persons = @[
@{@"name" : @"jack", @"qq" :@"432423423", @"books": @[@"5分钟突破iOS编程",@"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" :@"767567"},
@{@"name" : @"jim", @"qq" : @"423423"},
@{@"name" : @"jake", @"qq" :@"123123213"}]; //数组里有字典,字典里面有词典

NSDictionary *jim = persons[2]; NSLog(@"%@", jim); //表示jim所在的那个字典

NSString *bookName = persons[0][@"books"][1];   
NSLog(@"%@", bookName);  //先取数组0位置对应的字典,再取出自带里book数组的第2本书

NSArray *array = persons[0][@"books"];//将书全部放在arry数组里面
NSLog(@"%@", array);  

NSLog(@"%@", persons[1][@"qq"]); //先取出1位置对应的字典,再取出字典中qq这个key对应的数据

---集合的总结:

 1>NSArray\NSMutableArray
 有序
 快速创建(不可变):@[obj1, obj2, obj3]
 快速访问元素:数组名[i]

 2>NSSet\NSMutableSet
 无序

 3>NSDictionary\NSMutableDictionary
 无序
 快速创建(不可变):@{key1 : value1,  key2 : value2}
 快速访问元素:字典名[key]

---NSNumber


NSNumber:在前面学习的集合的元素只能是对象,但是如果想要把一般数据类型放进去就需要将它们转化成对象才行,OC中的NSNumber可以将一般数剧类型包装成对象。


1.将基本数据类型转为NSNumber


NSNumber *num = [NSNumber numberWithInt:10];
int a =[num intValue]; // 转换回来


NSNumber *n = [NSNumber numberWithDouble:10.5];  
double b = [n doubleValue]; // 转换回来


2.数据转为NSString


int a=20;


NSString *str = [NSString stringWithFormat:@"%d", a];   //这将20转为@"20"即数据转为string


NSLog(@"%d", [str intValue]);


3.快速转为NSNumber:
将各种基本数据类型包装成NSNumber对象

@10.5;

@YES;

@'A'; //注意:@"A"; 它是 NSString对象

将age变量包装成NSNumber对象

int age = 100;

@(age); //或者[NSNumbernumberWithInt:age];

---NSDate 

NSDate:OC中将日期也封装成一个NSDate类,是它是一个日期时间类.

1.创建一个时间对象

NSDate *date = [NSDate date];

2.打印出的时候是0时区的时间(北京-东8区)

NSLog(@"%@", date);

3.表示从运行到此行代码时间5秒钟后的时间

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

4.从1970开始走过的秒数

NSTimeInterval seconds = [date2 timeIntervalSince1970];

5.日期的格式

可以改变日期的格式

NSDate *date = [NSDate date]

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

// y 年  M 月  d 日

// m 分 s 秒  H (24)时  h(12)时

formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

NSString *str = [formatter stringFromDate:date];

NSLog(@"%@", str);

6.将字符转成日期

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)

---NSValue

NSValue:NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue。

1.结构体转为OC对象 

CGPoint p = CGPointMake(10, 10);

将结构体转为Value对象
NSValue *a = [NSValue valueWithPoint:p];

2.将Value对象转为对应的结构体

CGPoint p = [a pointValue];

NSArray *array = @[a];


 

你可能感兴趣的:(Foundation框架—NSArray、NSSet、NSDictionary、NSNumber、NSDate、NSValue)