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 <Foundation/Foundation.h>

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 <Foundation/Foundation.h>

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 <Foundation/Foundation.h>

@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 <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>

@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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容