// 补充
- 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;
}
- 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