IOS开发-Foundation笔记(二)

NSSet

定义: NSSet是一个无序的,管理多个对象集合类,最大的特点是集合中不允许出现任何重复对象,数组元素是否重复,可根据哈希值判断,如果没有重复的,可以直接将对象放到集合里,如果有哈希值相同的对象,然后利用isEqual判断是否是同一个对象,如果返回值是YES,代表相同,就不存放在集合里,如果返回假,就将对象存放在集合里

用法:

     //创建的三种方法:
    NSSet *set0 = [NSSet setWithObjects:@"one", @"two", @"two", @"three", nil];//集合中不能有重复的内容NSSet *set1 = [NSSet setWithSet:set0];    //生成集合set0的副本set1
    NSSet *set2                = [NSSet setWithArray:array];//用数组来生成集合,此处的array是一个含有多个元素的数组
    //判断一个集合中,是否包含指定的元素
    if ([set2 containsObject:s1] == YES)		//contain : 容纳,包含,包括;	s1是含有多个元素的数组中的一个元素
    {
        NSLog(@"集合set2中包含对象s1");
    }
    //判断两个集合是否相同
    if ([set1 isEqualTo:set2] == NO)		//当返回值是YES时,集合set1与set2相等
    {
        NSLog(@"集合set1与set2不相等");
    }
    //判断一个集合是否为另一个集合的子集
    if ([set1 isSubsetOfSet:set2] == NO)
    {
        NSLog(@"集合set1不是集合set2的子集");
    }
    //将一个集合转换成数组
    NSArray *objs              = [set2 allObjects];
    NSLog(@"%@", objs);
    //枚举器遍历集合
    NSEnumerator *e            = [set2 objectEnumerator];//NSEnumerator:枚举器,可以遍历Foundation中的所学的集合元素
    TRStudent *s;
    while (s                   = [e nextObject])
    {
        NSLog(@"%@", s);
    }
    NSEnumerator *e1           = [set1 objectEnumerator];
    NSString *str;
    while (str                 = [e1 nextObject])
    {
        NSLog(@"%@", str);
    }
    hash和isEqual使用方法:
    -(NSUInteger)hash		//大略滤除相同的元素
    {
        return self.age;
    }
    -(BOOL)isEqual:(id)object		//精细滤除
    {
        if (self == object)
            return YES;
        if ([object isMemberOfClass:[TRStudent class]] == YES)		//判断他们的类型是否相同,也可以用isKindOfClass;
        {
            TRStudent *stu             = object;//当类型相同时候,再进行比较里面的属性
            if (([self.name isEqualToString:stu.name] == YES) && self.age == stu.age)
            {
                return YES;		//返回YES表示两个对象重复了
            }
        }
        return NO;  	//返回NO表示两个对象不重复
    }
#pragma mark - NSMutableSet
    //创建
    NSMutableSet *set          = [NSMutableSet set];//创建了一个空的集合,有意义的,后面可以向其中添加元素
    NSMutableSet *set1         = [NSMutableSet setWithCapacity:18];//Capacity: 容纳能力;创建一个预估空间的集合,目的是加快运行速度
    NSMutableSet *set2         = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil];//标准方法
    //添加元素
    [set addObject:@"one"];		//添加一个元素
    NSArray *data              = @[@"five", @"six", @"seven"];//简化方法创建一个包含要添加的元素的不可变数组
    [set2 addObjectsFromArray:data];		//从数组array中添加多个元素
    //删除元素
    [set2 removeObject:@"two"];		//删除一个元素
    [set2 removeAllObjects];		//一次删除所有元素
    //交集
    NSMutableSet *set3         = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil];
    NSMutableSet *set4         = [NSMutableSet setWithObjects:@"one", @"three", @"four", nil];
    [set3 intersectSet:set4];		//intersect :交集,相交  求set3与set4的交集,运算结果被保存在set3中
    //并集
    NSMutableSet *set5         = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil];
    [set5 unionSet:set4];		//将运算结果放入set5中
    //删除多个元素
    [set5 minusSet:set3];		//从set5中删除set3中的所有元素


NSDictionary:

定义: 不可变字典,由键-值对组合的集合,key-value,痛过key键得到相应的value值;

key通常是字符类型,key值不允许重复,value则可以;

TRStudent *stu1            = [[TRStudent alloc] initWithName:@"zhangsan" andAge:18];
TRStudent *stu2            = [[TRStudent alloc] initWithName:@"lisi" andAge:22];
TRStudent *stu3            = [[TRStudent alloc] initWithName:@"wangwu" andAge:20];
//字典的创建:
NSDictionary *dict1        = [NSDictionary dictionaryWithObjectsAndKeys:stu1, @"1", stu2, @"2", stu3, @"3", stu1, @"4", nil];//①标准创建
NSDictionary *dict2        = @{@"1":stu1, @"2": stu2, @"3":stu3};//④字典创建的简化方法
NSArray *objects           = @[stu1,stu2];
NSArray *keys              = @[@"1",@"2"];
NSDictionary *sict2        = [NSDictionary dictionaryWithObjects:objects forKeys:keys];//②数组创建
NSDictionary *dict3        = [NSDictionary dictionaryWithDictionary:dict1];//③复制创建
//获取字典中的所有关键字:
NSArray *keys              = [dict1 allKeys];//获取多有key值
NSLog(@"%@", keys);
//获取字典中的所有值的内容
NSArray *values            = [dict1 allValues];
//根据关键字,求相应的值的内容
NSLog(@"%@", [dict1 objectForKey:@"1"]);
NSLog(@"%@", [dict1 valueForKey:@"1"]);
//根据值的内容,求相应的关键字
NSArray *keys1             = [dict1 allKeysForObject:stu1];//由于可以重复,所以可能会有多个关键字对应同一个值,所以该方法的返回值是一个数组
//根据多个key找多个value
NSArray *keys2             = @[@"1", @"5"];
NSArray *values1           = [dict1 objectsForKeys:keys2 notFoundMarker:@"no-found"];//key值对应的value没有找到,则输出no-found
NSLog(@"%@", values1);
//简化的通过key找到value
NSLog(@"%@", dict2[@"1"]);
#pragma mark -四种遍历:
//普通遍历
NSArray *keys3             = [dict2 allKeys];
for (int i                 = 0; i < [keys3 count]; i++)
{
    NSLog(@"%@                 = %@", keys3[i], dict2[keys3[i]]);
}
//枚举器:所有value
NSEnumerator *e1           = [dict2 objectEnumerator];
TRStudent *stu;
while(stu                  = [e1 nextObject])
{
    NSLog(@"%@", stu);
}
//枚举器:所有key
NSEnumerator *e2           = [dict2 keyEnumerator];
NSString *key;
while(key                  = [e2 nextObject])
{
    NSLog(@"%@", key);
}
//快速:只能遍历key
for (NSString *key in dict2)
{
    NSLog(@"%@=%@", key, dict2[key]);
}
//将字典的内容写入文件
NSDictionary *dict3        = [NSDictionary dictionaryWithObjectsAndKeys:@"string1", @"1", @"string2", @"2", @"string3", @"3", nil];
[dict3 writeToFile:@“目标文件绝对地址” atomically:YES];		//导出文件
//用文件中的内容生成字典
NSDictionary *dict4        = [NSDictionary dictionaryWithContentsOfFile:@"/Users/tarena/Desktop/dict.plist"];//导入文件

NSMutableDictionary

义: 可修改字典,是NSDictionary的子类

//创建方法
NSMutableDictionary *dict  = [NSMutableDictionary dictionary];//①创建一个空字典,有意义的,在后面可以向字典中添加键值对
NSMutableDictionary *dict1 = [NSMutableDictionary dictionaryWithCapacity:18];//②预估值
NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"one", @"1", @"two", @"2", nil];//③标准方法
//添加方法
[dict2 setValue:@"three" forKey:@"3"];		//添加一个键值对
NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
[dict3 addEntriesFromDictionary:dict2];		//将一个字典中的键值对,放入另一个字典中
//覆盖:替换
NSDictionary *dict4        = [NSDictionary dictionaryWithObjectsAndKeys:@"aaa", @"1", @"bbb", @"2", @"ccc", @"3", nil];
[dict3 setDictionary:dict4];		//用dict4中的所有键值对,替换dict3中的所有键值对
//删除
[dict3 removeObjectForKey:@"1"];		//根据key来删除一个键值对
NSArray *keys              = @[@"2", @"3"];
[dict3 removeObjectsForKeys:keys];		//根据key数组删除多个键值对
NSLog(@"%lu", [dict3 count]);
[dict3 removeAllObjects];		//清除字典中的所有键值对

 判断某个类或对象包括某个方法或遵守某个协议

Protocol *p = @protocol(NSCopying);//生成协议选择器!   关键字:@protocol:协议
if ([TRStudent conformsToProtocol:p]==YES)    /**conform:遵守 判断类是否遵守了NSCopying协议 */
//if ([TRStudent conformsToProtocol:@protocol(NSCopying)]==YES) 上面的等同于这句话
{
    TRStudent *student1 = [student copy];//此处为深拷贝
    [student1 study];
}

方法选择器:

SEL sel = @selector(study);//生成一个方法选择器,所有类里定义的方法!   关键字:@selector:选择器
//上面这句中:SEL是方法的类型,sel是方法的变量
if ([TRStudent instancesRespondToSelector:sel] == YES)     //instance :情况,例子
{
    NSLog(@"类TRStudent中 存在 study方法");
}
else
{
    NSLog(@"类TRStudent中 不存在 study方法");
}

Runtime

存在意义:     Objective-C语言中,许多工作是在运行时执行的,用Runtime在运行系统时来执行编译后的代码

Block

定   义:    Block封装一段代码,可以在任何时候执行,Block可作为函数的参数或者返回值,而本身又可以带输入参数或返回值,与传统函数指针相类似,但是绝对不是函数;  函数是不允许嵌套定义的,也就是不允许在函数的定义里再去定义一个函数.

block可以在函数的定义里定义;


你可能感兴趣的:(NSDictionary,NSSet)