ios-OC-NSSet类型、NSEnumerator、点语法

// 补充

  1. NSSet类型
    NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合; NSSet无序的集合,在内存中存储方式是不连续的,不像NSArray,NSDictionary(都是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的
    NSSet和我们常用NSArry区别是:在搜索一个一个元素时NSSet比NSArray效率高,主要是它用到了一个算法hash(散列,也可直译为哈希)
    比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了

#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //1. NSSet的实例化方法
        NSSet *setOne = [[NSSet alloc] initWithObjects:@"张三",@"猪八戒",nil];
        // 2.类方法
        NSSet *setTwo = [NSSet setWithObjects:@"张三",@"武松",@"武大郎",@"西门庆", nil];
        // 3.通过NSArray
        NSArray *array = @[@"张三",@"武松",@"武大郎",@"西门庆"];
        NSSet *setThree = [NSSet setWithArray:array];
        
        // NSSet 转成 NSArray
        NSArray *arrayOne = [setThree allObjects];
        
        
        // 使用方法
        // 判断是否包含某个元素
        //[setThree containsObject:@"武松"];
        if ([setThree containsObject:@"武松"]) {
            NSLog(@"武松在家");
        }else{
            NSLog(@"武松不在家");
        }
        
        // 两个set 是否有交集
        if ([setThree intersectsSet:setOne]) {
            NSLog(@"......");
        }
        
        // 两个set 是否相等
        [setThree isEqualToSet:setOne];
        
        // 是否为子集合的关系(是前面一个与后面一个比较)
        [setThree isSubsetOfSet:setOne];
        
        // 合并
        NSSet *setFive = [setThree setByAddingObjectsFromSet:setOne];
        NSSet *setSix = [setThree setByAddingObjectsFromArray:arrayOne];
        
        // 可变NSSet
        NSMutableSet *setMOne = [[NSMutableSet alloc] init];
        NSMutableSet *setMTwo = [NSMutableSet setWithObjects:@"卡卡西",@"武松",@"武大郎",@"西门庆", nil];
        // 增
        [setMOne addObject:@"卡卡西"];
        [setMOne addObject:@"卡卡"];
        // 删
       //  [setMOne removeObject:@"卡卡西"];
        
        // 删除setMOne中, 和setMTwo相同的元素
       //[setMOne minusSet:setMTwo];
        
        // 合并集合(把后面的赋值给第一个)
        [setMOne unionSet:setThree];
        
        // 求两个集合的相同元素
        [setMOne intersectSet:setThree];
        
        // 删除所有元素
        [setMOne removeAllObjects];
        
    }
    return 0;
}
  1. NSEnumerator
    集合类(如:NSArray、NSSet、NSDictionary等)均可获取到NSEnumerator, 该类是一个抽象类,没有用来创建实例的公有接口。NSEnumerator的nextObject方法可以遍历每个集合元素,结束返回nil,通过与while结合使用可遍历集合中所有项。主要是和集合配合使用。
#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 主要和 数组和字典配合使用
        NSDictionary *dict = @{
                               @"西游记":@"白骨精",
                               @"红楼梦":@"刘姥姥",
                               @"英雄联盟":@"小学生"
                                 };
        //应该是取出字典中所有的键  复制给enmu
        NSEnumerator *enmu = [[dict allValues] objectEnumerator];
        //创建一个不可变字符串指针
        NSString *strKey;
        //条件就是遍历enmu里面的元素    nextObject是表示下一个的意思
        while (strKey = [enmu nextObject]) {
            
            //正序打印字典中的键 显示出来的是值
            NSLog(@"%@",strKey);
        }
        
        NSArray *array = @[@"菩提祖师",@"薛宝钗",@"坑",@"貂蝉"];
        
        // 正序输出
        NSEnumerator *enumArray = [array objectEnumerator];
        
        NSString *strArray;
        while (strArray = [enumArray nextObject]) {
            NSLog(@"%@",strArray);
        }
        
      /*  // 逆序输出
           //  加了这个reverse这个修饰的  表示的是逆序
        NSEnumerator *enumReverse = [array reverseObjectEnumerator];
        NSString *reverStr;
        while (reverStr = [enumReverse nextObject]) {
            NSLog(@"-----%@",reverStr);
        }*/
      
        
    }
    return 0;
}

一.setter和getter

【setter】set方法,用于给成员变量赋值,

如-(void)setHeight:(int)heightNew

原因:为了防止别人给你的成员变量乱赋值,
函数规范:1.没有返回值。
2.命名规范方法名必须以set开头,后面跟上成员变量的名称.
3.成员变量的名称首字母必须大写,

参数规范: 1.一定要有一个参数,而且和成员变量 类型一致,
2.参数名和成员变量名不能一致

【getter】get方法,用于返回成员变量的值,如height

- (int)height

原因:别人想看到我们的成员变量,但是我们又不想让他乱改我们的

函数规范: 1.有返回值,
2.值的类型就是成员变量的类型一样
3.方法名和成员变量名一样

二.点操作
【见点操作见代码 点语法Demo】

【注】点操作不是使用成员变量,是调用成员方法

三.属性
【见属性Demo】

@property NSUInteger x;

//创建下述两个方法

//- (void)setX:(NSUInteger)x;
//- (NSUInteger)x;

@synthesize x = _x;

//实现下述两个方法 Xcode4.6以后可以省略

//- (void)setX:(NSUInteger)x
//{
//    _x = x;
//}
//
//- (NSUInteger)x
//{
//    return _x;
//}

【注】当我们创建如下属性

@property NSUInteger x;

假如当前类有变量NSUInteger _x, 会自动和属性关联
假如当前类没有对应变量,会自动产生NSUInteger _x变量

// 练习: 通讯录每个人的通讯录使用换行分开
//姓名,昵称,性别,手机,家庭座机,公司座机,公司,职务,所属群组,公司地址,家庭住址,生日,电子邮件,QQ号码,MSN号码,备注

四.属性的修饰符
【见属性修饰符Demo】
//属性修饰符

//只读修饰符

@property (readonly) NSString * name;

//只有get方法,没有set方法

//(默认修饰符,不写就是这个)缺省修饰符

@property (readwrite) NSString * address;

//同时创建set方法和get方法

//给set方法和get方法起别名

@property (getter = agi, setter = setAgi:) int age;

//原子操作,缺省修饰符

@property (atomic) NSString * group;

//在iOS开发中,官方框架的类的属性多为
//非原子操作

@property (nonatomic) NSString * grade;

//多个属性修饰符,需要用逗号隔开

@property (nonatomic, readonly, getter = birth) NSString * birthDay;

// 1. 计算长方形的周长

  RectR *re = [[RectR alloc] init];
        re.longth = 100;
        re.wide = 200;
        
        int vul = 2*(re.longth + re.wide);
        NSLog(@"%d",[re vulum]);
#import 

@interface RectR : NSObject

@property int wide;

@property int longth;

- (int )vulum;
@end
#import "RectR.h"

@implementation RectR
- (int)vulum
{
    return 2 *(_longth + _wide);
}
@end

点语法案列

#import 
#import "Dog.h"
#import "RectR.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Dog *dog = [[Dog alloc] init];
        
        // 赋值的就是调用的setter方法
        // 没有赋值的就是调用getter方法
        // 点语法 就是调用方法
        
        [dog setColor:@"红色"];
        dog.color = @"红色";
        
        [dog color];
        NSLog(@"%@",dog.color);
        
        
        [dog setName:@""];
         dog.name = @"小黄";
        
        NSLog(@"%@",dog.name);
}
#import 

@interface Dog : NSObject
{
    NSString *_color;
    NSString *_name;
}

// @property 自动帮助我们创建了setter 和 getter方法
// 和带有下划线的成员变量
// 如果使用了@property 之后你又自己实现setter 和 getter方法,系统就不会帮你生成带有下划线的成员变量
@property NSString *name;

- (void)setColor:(NSString *)color;
- (NSString *)color;
@end
#import "Dog.h"

@implementation Dog
- (void)setColor:(NSString *)color
{
    _color = color;
}

- (NSString *)color
{
    return  _color;
}

- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}
@end

你可能感兴趣的:(ios-OC-NSSet类型、NSEnumerator、点语法)