Objective-C: Foundation——NSDictionary、NSMutableDictionary、Block

来源:互联网 发布:淘宝知网查重靠谱吗 编辑:程序博客网 时间:2024/06/05 09:54

1.NSDictionary

1.1 由键值组成,关键字不允许重复,值可以重复。
1.2 创建方法
1.3 求键值对个数
1.4 将字典中的所有值转换成数组
1.5 将字典中的所有关键字转换成数组
1.6 通过关键字找到对应的值(3种)
1.7 通过值来找到对应的关键字
1.8 对字典的值进行排序
1.9 遍历(3种)
1.10 字典的文件读写方法
main函数

int main(int argc, const char * argv[]) {    @autoreleasepool {        //创建方法        NSDictionary *dict1=[NSDictionary dictionaryWithObjectsAndKeys:@"one",@"1", @"two",@"2",@"three",@"3",nil]; //标准方法,先写值后写关键字        NSLog(@"标准创建%@",dict1);        NSDictionary *dict2=@{@"1":@"one",@"2":@"two",@"3":@"three"}; //优化方法,先写关键字,常用        NSLog(@"常用方法%@",dict2);        NSArray *object=@[@"one",@"two",@"three"];        NSArray *key=@[@"1",@"2",@"3"];        NSDictionary* dict3=[NSDictionary dictionaryWithObjects:object forKeys:key]; //数组转换成字典        NSLog(@"数组转换:%@",dict3);        NSDictionary *dict4=[NSDictionary dictionaryWithDictionary:dict3];//创建副本        NSLog(@"创建副本:%@",dict4);        //求键值对个数        NSLog(@"键值对个数:%lu",dict3.count);        //获取字典中的所有值,即将字典转换成数组的方法        object=[dict3 allValues];        NSLog(@"数组获取字典的值:%@",object);        //获取字典中的关键字,即将字典转换成数组的方法        key=[dict3 allKeys];        NSLog(@"数组获取字典关键字:%@",key);        //根据一个关键字来查找一个值        NSString *str=[dict3 objectForKey:@"1"];  //标准方法,求出1所对应的值返回        NSLog(@"1对应的值%@",str);        str=dict3[@"1"];  //优化方法,常用        NSLog(@"优化方法:%@",str);        //根据多个关键字找多个值        NSArray *key1=@[@"1",@"4"];        NSArray *object1=[dict3 objectsForKeys:key1 notFoundMarker:@"没有对应的值"];        for(id obj in object1)        {            NSLog(@"找值:%@",obj);        }        //通过值找对应的关键字        NSArray *key2=[dict3 allKeysForObject:@"three"];        NSLog(@"%@",key2);        //对字典中的值进行排序        NSArray *key3=[dict3 keysSortedByValueUsingSelector:@selector(compare:)];        for(id obj in key3)        {            NSLog(@"%@=%@",obj,dict3[obj]);        }        CZStudent *stu1=[CZStudent studentWithName:@"no1" andAge:16];         CZStudent *stu2=[CZStudent studentWithName:@"no2" andAge:20];         CZStudent *stu3=[CZStudent studentWithName:@"no3" andAge:19];        NSDictionary *stu=@{@"1":stu1,@"2":stu2,@"3":stu3};        NSArray *sorted=[stu keysSortedByValueUsingSelector:@selector(compareAge:)];        for(id i in sorted)        {            NSLog(@"%@=%@",i,stu[i]);        }        //遍历        NSEnumerator *e=[dict3 objectEnumerator]; //枚举值遍历        while(str=[e nextObject])        {            NSLog(@"%@",str);        }        e=[dict3 keyEnumerator];  //枚举关键字遍历        while(str=[e nextObject])        {            NSLog(@"%@",str);        }        for(id obj in dict3)        {            NSLog(@"%@=%@",obj,dict3[obj]);        }        //字典的文件读写        [dict3 writeToFile:@"/Users/tarena/Desktop/dict.plist" atomically:YES];        NSDictionary *dict5=[NSDictionary dictionaryWithContentsOfFile:@"/Users/tarena/Desktop/dict.plist"];        NSLog(@"%@",dict5);    }    return 0;}

运行结果

2016-08-30 10:52:07.899 cz_day23_01[1119:46687] 标准创建{    1 = one;    2 = two;    3 = three;}2016-08-30 10:52:07.900 cz_day23_01[1119:46687] 常用方法{    1 = one;    2 = two;    3 = three;}2016-08-30 10:52:07.900 cz_day23_01[1119:46687] 数组转换:{    1 = one;    2 = two;    3 = three;}2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 创建副本:{    1 = one;    2 = two;    3 = three;}2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 键值对个数:32016-08-30 10:52:07.901 cz_day23_01[1119:46687] 数组获取字典的值:(    one,    two,    three)2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 数组获取字典关键字:(    1,    2,    3)2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 1对应的值one2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 优化方法:one2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 找值:one2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 找值:没有对应的值2016-08-30 10:52:07.901 cz_day23_01[1119:46687] (    3)2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 1=one2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 3=three2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 2=two2016-08-30 10:52:07.901 cz_day23_01[1119:46687] 1=name:no1,age:162016-08-30 10:52:07.901 cz_day23_01[1119:46687] 3=name:no3,age:192016-08-30 10:52:07.902 cz_day23_01[1119:46687] 2=name:no2,age:202016-08-30 10:52:07.902 cz_day23_01[1119:46687] one2016-08-30 10:52:07.902 cz_day23_01[1119:46687] two2016-08-30 10:52:07.902 cz_day23_01[1119:46687] three2016-08-30 10:52:07.902 cz_day23_01[1119:46687] 12016-08-30 10:52:07.902 cz_day23_01[1119:46687] 22016-08-30 10:52:07.902 cz_day23_01[1119:46687] 32016-08-30 10:52:07.902 cz_day23_01[1119:46687] 1=one2016-08-30 10:52:07.902 cz_day23_01[1119:46687] 2=two2016-08-30 10:52:07.902 cz_day23_01[1119:46687] 3=three2016-08-30 10:52:07.906 cz_day23_01[1119:46687] {    1 = one;    2 = two;    3 = three;}Program ended with exit code: 0

2.NSMutebleDictionary

2.1 可变字典,是NSDictionary的子类
2.2 创建方法(3种)
2.3 添加方法(2种)
2.4 覆盖方法
2.5 删除方法

main函数

int main(int argc, const char * argv[]) {    @autoreleasepool {        //创建方法        NSMutableDictionary *dict1=[NSMutableDictionary dictionary]; //空字典,有意义        NSMutableDictionary *dict2=[NSMutableDictionary dictionaryWithCapacity:100];  //预估值        NSMutableDictionary *dict3=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3", nil];  //标准方法        NSMutableDictionary *dict4=@{@"1":@"one",@"2":@"two"};   //退化成不可变字典        //添加方法        [dict3 setValue:@"four" forKey:@"4"];        NSLog(@"%@",dict3);        NSDictionary *added = @{@"5":@"five",@"6":@"six",@"7":@"seven"};        [dict3 addEntriesFromDictionary:added];        NSLog(@"%@",dict3);        //覆盖        NSDictionary *dict5=@{@"1":@"one",@"2":@"two",@"3":@"three"};        NSMutableDictionary *dict6=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"aaa",@"1",@"bbb",@"2",@"ccc",@"3", nil];        [dict6 setDictionary:dict5];        NSLog(@"%@",dict6);        //删除方法        [dict3 removeObjectForKey:@"1"];  //删除指定关键字对应的键值对        NSLog(@"%@",dict3);        NSArray *del =@[@"3",@"5"];        [dict3 removeObjectsForKeys:del];        NSLog(@"%@",dict3);        [dict3 removeAllObjects];        NSLog(@"%lu",dict3.count);    }    return 0;}

运行结果

2016-08-30 11:55:45.041 cz_day23_03[1325:65844] {    1 = one;    2 = two;    3 = three;    4 = four;}2016-08-30 11:55:45.041 cz_day23_03[1325:65844] {    1 = one;    2 = two;    3 = three;    4 = four;    5 = five;    6 = six;    7 = seven;}2016-08-30 11:55:45.042 cz_day23_03[1325:65844] {    1 = one;    2 = two;    3 = three;}2016-08-30 11:55:45.042 cz_day23_03[1325:65844] {    2 = two;    3 = three;    4 = four;    5 = five;    6 = six;    7 = seven;}2016-08-30 11:55:45.042 cz_day23_03[1325:65844] {    2 = two;    4 = four;    6 = six;    7 = seven;}2016-08-30 11:55:45.042 cz_day23_03[1325:65844] 0Program ended with exit code: 0

3.Block

3.1 是一种新的数据类型,用于定义变量
3.2 Block类型的变量中存储的数据是一段程序代码
3.3 语法
3.4 Block与全局变量
3.5 Block与局部变量
3.6 Block在自定义类中的使用

建立一个MyClass类
.h文件

#import <Foundation/Foundation.h>typedef void(^myBlock2)();typedef double(^myBlock3)(int,int);@interface CZMyClass : NSObject-(void)method;-(void)method:(myBlock2)b;-(void)method2:(myBlock3)b;-(void)method3:(myBlock3)b andX:(int)x andY:(int)y;-(myBlock2)getBlock;@property(strong) myBlock2 b;@end

.m文件

#import "CZMyClass.h"@implementation CZMyClass-(void)method{    NSLog(@"method被执行了");}-(void)method:(myBlock2)b{    NSLog(@"Block做形参,进行调用结果是:");    b(); //回调}-(void)method2:(myBlock3)b{    NSLog(@"%lg",b(3,5));}-(void)method3:(myBlock3)b andX:(int)x andY:(int)y{    NSLog(@"%lg",b(x,y));}-(myBlock2)getBlock{    return ^void(void) {        NSLog(@"Block做方法返回值");};}@end

main函数

#import <Foundation/Foundation.h>#import "CZMyClass.h"int g_i=10;void fun(){    NSLog(@"函数被执行了");}void(^myBlock)(void) = ^void(void){    NSLog(@"Block被执行了");};double(^myBlock1)(int,int)=^double(int a,int b){    return a+b;};typedef void(^BlockType)(void);typedef double(^BlockType1)(int,int);void fa(BlockType1 a){    NSLog(@"%lg",a(3,5));}int main(int argc, const char * argv[]) {    @autoreleasepool {        //语法        fun();        myBlock();        void(*pf)()=fun;        pf();        NSLog(@"%lg",myBlock1(2,3));        BlockType b1;        b1=^void(void)        {            NSLog(@"用Block类型定义的变量");        };        b1();        BlockType1 b2=^double(int a,int b)        {            return a+b;        };        NSLog(@"%lg",b2(5,6));        fa( ^double(int a,int b) {return a*b;} );        //Block与全局变量        BlockType1 b3=^double(int a,int b)        {            a *=g_i;  //全局变量可用被访问            g_i=20;  //全局变量可用被赋值            return a+b;        };        NSLog(@"%lg",b3(2,3));        NSLog(@"全局变量:%d",g_i);        //Block与局部变量        int i2=30;        __block int i3=50;        BlockType b4=^void(void)        {            NSLog(@"Bolck访问局部变量:%d",i2); //局部变量可用在Block中被访问;         //   i2=40; ,局部变量不能在Block中赋值            i3=60;  //加上 __block后,局部变量可用在Block中被赋值        };        b4();        NSLog(@"加上关键字__block的局部变量%d",i3);        //Block在自定义类中的使用        CZMyClass *c=[[CZMyClass alloc]init];        [c method];        [c method:^void(void)        {            NSLog(@"随意吧");        }];         [c method:^void(void)        {            NSLog(@"不随意");        }];    //method实现多态        [c method2:^double(int a, int b)        {            return a+b;        }];        [c method3:^double(int x, int y)         {             return x*y;         } andX:3 andY:5];        [c getBlock]();        c.b=^void(void)        {            NSLog(@" Block做属性");        };        c.b();        //用Block排序        NSNumber *a1=[NSNumber numberWithInt:10];        NSNumber *a2=[NSNumber numberWithInt:8];        NSNumber *a3=[NSNumber numberWithInt:20];        NSNumber *a4=[NSNumber numberWithInt:2];        NSNumber *a5=[NSNumber numberWithInt:15];        NSArray *num=@[a1,a2,a3,a4,a5];        NSArray *sorted=[num sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2)                         {                             return [obj1 compare:obj2];   //obj1,obj2调换就是升序                         }];        NSLog(@"%@",sorted);        NSArray *str =@[@"one",@"two",@"three"];        sorted=[str sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2)                {                    return [obj1 compare:obj2];                }];        NSLog(@"%@",sorted);        //Block与字典        NSDictionary *dict=@{@"1":a1,@"2":a2,@"3":a3,@"4":a4};        sorted = [dict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1,id obj2)                  {                      return [obj1 compare:obj2];                  }];        for(id obj in sorted)        {            NSLog(@"%@=%@",obj,dict[obj]);        }        NSLog(@"---------------");        NSDictionary *dict2=@{@"1":@"one",@"2":@"two",@"3":@"three"};        sorted =[dict2 keysSortedByValueUsingComparator:^NSComparisonResult(id obj1,id obj2)                 {                     return [obj1 compare:obj2];                 }];        for(id obj in sorted)        {            NSLog(@"%@=%@",obj,dict2[obj]);        }    }    return 0;}

运行结果

2016-08-30 16:57:55.646 cz_day23_04[2006:191654] 函数被执行了2016-08-30 16:57:55.647 cz_day23_04[2006:191654] Block被执行了2016-08-30 16:57:55.647 cz_day23_04[2006:191654] 函数被执行了2016-08-30 16:57:55.647 cz_day23_04[2006:191654] 52016-08-30 16:57:55.647 cz_day23_04[2006:191654] 用Block类型定义的变量2016-08-30 16:57:55.647 cz_day23_04[2006:191654] 112016-08-30 16:57:55.647 cz_day23_04[2006:191654] 152016-08-30 16:57:55.647 cz_day23_04[2006:191654] 232016-08-30 16:57:55.647 cz_day23_04[2006:191654] 全局变量:202016-08-30 16:57:55.648 cz_day23_04[2006:191654] Bolck访问局部变量:302016-08-30 16:57:55.648 cz_day23_04[2006:191654] 加上关键字__block的局部变量602016-08-30 16:57:55.648 cz_day23_04[2006:191654] method被执行了2016-08-30 16:57:55.648 cz_day23_04[2006:191654] Block做形参,进行调用结果是:2016-08-30 16:57:55.648 cz_day23_04[2006:191654] 随意吧2016-08-30 16:57:55.648 cz_day23_04[2006:191654] Block做形参,进行调用结果是:2016-08-30 16:57:55.648 cz_day23_04[2006:191654] 不随意2016-08-30 16:57:55.648 cz_day23_04[2006:191654] 82016-08-30 16:57:55.648 cz_day23_04[2006:191654] 152016-08-30 16:57:55.648 cz_day23_04[2006:191654] Block做方法返回值2016-08-30 16:57:55.648 cz_day23_04[2006:191654]  Block做属性2016-08-30 16:57:55.649 cz_day23_04[2006:191654] (    2,    8,    10,    15,    20)2016-08-30 16:57:55.649 cz_day23_04[2006:191654] (    one,    three,    two)2016-08-30 16:57:55.649 cz_day23_04[2006:191654] 4=22016-08-30 16:57:55.649 cz_day23_04[2006:191654] 2=82016-08-30 16:57:55.649 cz_day23_04[2006:191654] 1=102016-08-30 16:57:55.649 cz_day23_04[2006:191654] 3=202016-08-30 16:57:55.649 cz_day23_04[2006:191654] ---------------2016-08-30 16:57:55.649 cz_day23_04[2006:191654] 1=one2016-08-30 16:57:55.649 cz_day23_04[2006:191654] 3=three2016-08-30 16:57:55.649 cz_day23_04[2006:191654] 2=twoProgram ended with exit code: 0

练习

#import <Foundation/Foundation.h>#import "CZStudent.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        CZStudent *s1=[CZStudent studentWithName:@"cz" andAge:15];        CZStudent *s2=[CZStudent studentWithName:@"sx" andAge:20];        CZStudent *s3=[CZStudent studentWithName:@"hh" andAge:22];        CZStudent *s4=[CZStudent studentWithName:@"dd" andAge:14];        CZStudent *s5=[CZStudent studentWithName:@"as" andAge:18];        NSArray *array=@[s1,s2,s3,s4,s5];        NSDictionary *dict=@{@"1":s1,@"2":s2,@"3":s3,@"4":s4,@"5":s5};        NSArray *sorted1=[array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2)                         {                             return [[obj1 name] compare:[obj2 name]];                         }];        NSArray *sorted2=[dict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1,id obj2)                          {                              NSNumber *a1=[NSNumber numberWithInt:[obj1 age]];                              NSNumber *a2=[NSNumber numberWithInt:[obj2 age]];                              return [a1 compare:a2];                          }];        for(id obj in sorted1)        {            NSLog(@"%@",obj);        }        for(id obj in sorted2)        {            NSLog(@"%@=%@",obj,dict[obj]);        }    }    return 0;}

运行结果

2016-08-30 17:51:10.850 cz_day23_每日一练[2192:202408] name:as,age:182016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] name:cz,age:152016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] name:dd,age:142016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] name:hh,age:222016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] name:sx,age:202016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] 4=name:dd,age:142016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] 1=name:cz,age:152016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] 5=name:as,age:182016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] 2=name:sx,age:202016-08-30 17:51:10.851 cz_day23_每日一练[2192:202408] 3=name:hh,age:22Program ended with exit code: 0
0 0