NSArray
Foundation
框架中的一个类,这个类的对象是用来存储多个数据,具备数组的功能,所以NSArray
是OC
中的数组
- 只能存储
OC
对象,长度固定,创建完毕之后无法新增、删除 - 元素类型是
id
,都是紧密相连,都有自己的下标 - 对象存进去引用计数器加一,集合销毁全部元素减一
ARC
模式下,集合的元素是一个强类型指针
// 这样创建毫无意义,长度固定了
NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];
- 常用创建方法(最后必须写一个
nil
代表结束)
+ (instancetype)arrayWithObjects:(ObjectType)firstObj,...
// 需要以nil结尾
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
// 简要方式,不需要nil结尾
NSArray *arr = @[@"1",@"2",@"3"]
- 取出
- (ObjectType)objectAtIdex:(NSUInteger)index;
// 方法一,数组下标
NSLog(@"%@",arr[0]);
// 方法二
NSArray *str = [arr objectAtIndex:2];
NSLog(@"%@",str);
NSArray常用方法
/// 得到数组元素个数
@property (readonly) NSUInteger count;
/// 判断NSArray数组是否包含指定元素
-(BOOL)containsObject:(ObjectType)anObject;
/// 取数组第一个元素,如果没有元素取arr[0]报错,该方法取nil不报错
@property (nullable,nonatomic,readonly) ObjectType firstObject;
/// 取数组最后一个元素
@property (nullable,nonatomic,readonly) ObjectType lastObject;
/// 查找指定元素在数组第一次出现的下标,没有找到返回NSUInteger最大值(NSNotFound)
-(NSUInteger)indexOfObject:(ObjectType)anObject;
NSArray数组遍历
// 方法一 for循环♻️
for(int i = 0; i < arr.count;i++){
// 执行代码
}
// 方法二 forin循环♻️
// 增强for循环 👇 叫做迭代变量,类型需要和数组元素类型保持一致,可以使用id类型
for(元素类型 变量名 in 数组名) {
// 直接通过变量名取到数组每个元素
}
for(NSString *str in arr) {
NSLog(@"%@",str);
}
// 方法三
// arr为数组 obj为变量 idx为下标 stop为YES停止循环
[arr enumerateObjectsUsingBlock:^(id _Nonull obj,NSUInteger idx,BOOL * _Nonnull stop){
NSLog(@"%@",obj);
}];
NSArray与字符串
- 将数组中的元素连接组成一个新的字符串
// 参数:连接符
- (NSString *)componentsJoinedByString:(NSString *)separator
- 将字符串以指定分隔符分成数组,每一部分就是数组元素
- (NSArray<NSString *>*)componentsSeparatedByString:(NSString *)separator;
NSArray存放对象集,取出属性
NSArray *array = @[p1,p2,p3,p4];
//返回array数组的每个元素对象中的name属性
NSArray *arr = [array valueFoKeypath:@"name"];
NSMutableArray
- 继承了
NSArray
,仍然是一个数组,只能存储OC对象,每一个元素是紧密相连的 - 🌟可以新增和删除
// 可以使用
NSMutableArray *arr1 = [NSMutableArray new];
NSMutableArray *arr2 = [[NSMutableArray alloc]init];
NSMutableArray *arr3 = [NSMutableArray array];
NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];
// 简要方式,不建议使用,@[]返回的是不可变对象NSArray
NSMutableArray *arr5 = @[@"1",@"2",@"3"]
NSMutableArray添加
/// 可变数组添加新元素
- (void)addObject:(ObjectType)anObject;将传入的参数作为数组元素添加进去
/// 将另外一个数组中的每个元素添加到可变数组中
- (void)addObjectFromArray:(NSArray<ObjectType> *)otherArray;
/// 在可变数组中指定下标插入元素
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
NSMutableArray删除
/// 删除可变数组指定下标元素
-(void)removeObjectAtIndex:(NSUInteger)index;
/// 删除可变数组所有指定元素
-(void)removeObject:(ObjectType)anObject;
/// 删除指定范围中的元素
-(void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
/// 删除最后一个元素
-(void)removeLastObject;
/// 删除所有元素
-(void)removeAllObject;
NSMutableArray取出
NSString * str = [array objectAtIndex:0];
NSDictionary和NSMutableDictionary
以键值对存储数据的数组,需要指定别名
NSDictionary
- 字典数组一旦创建无法新增和删除
- 键:只能是遵守了
NSCoping
协议的对象,而NSString
就是遵守了这个协议 - 值:只能是
OC
对象 - 键不允许重复
/// 创建方法
+(instancetype)dictionaryWithObjectsAndKey:(id)firstObject,...
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKey:@"james",@"names",@"GD",@"address",nil];//值+键,值+键
// 简要创建方式
NSDictionary *dict = @{键:值,键:值,键:值,...};
NSDictionary *dict = @{@"name":@"james",@"address":@"gd",键:值,...};
NSDictionary取出字典数组的数据
// 方法一
NSLog(@"%@",dict[@"name"]);//取出name这个键对应的值
// 方法二 指定键值不存在返回nil
- (nullable ObjectType)objectForKey:(KeyType)aKey;
// 方法三(取出整个字典数组,按照ASCII输出,改变顺序了)
NSLog(@"%@",dict);
NSDictionary取到字典数组键值对的个数
@property(readonly) NSUInteger count;
NSDictionary字典的遍历
- 使用
for in
循环,可以遍历出来所有的键
for(id item in dict) {
NSLog(@"%@",item);//获取键值
NSLog(@"%@=%@",item,dict[item]);//通过键取出对应的值
}
- 使用
block
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key,id _Nonnull obj,BOOL *_Nounull stop) {
NSLog(@"%@=%@",key,obj);
}]
NSDictionary存储原理
- 存储键值对的时候,按照键的长度和数组长度做一个哈希算法,算出下标,将键值对存储在该下标处
- 取出也按照哈希算法算出下标取出
NSArray
是按照顺序存储
BOOL值存入字典和从字典中取出
由于字典中存储的键值对都必须是对象。所以把
BOOL
值存入字典的时候,需要转换成对象。两种方法
// 存入 其实两个方法本质都是转为NSNumber
// 方法一:给BOOL值加上括号@(),转为NSNumber
NSDictionary * dict = @{@"isOn":@(NO),@"name":@"Alice"};
// 方法二:直接使用NSNumber
NSNumber * boolNum = [NSNumber numberWithBool:NO];
NSDictionary * dict = @{@"isOn":boolNum),@"name":@"Alice"};
// 取出
NSNumber * boolNum = dict[@"yourBoolKey"];
BOOL isOn = [boolNum boolValue];
NSMutableDictionary
- 是
NSDictionary
的子类,也是一个字典数组,以键值对进行存储 - 🌟在父类的基础上进行扩展,可以动态的新增和删除
NSMutableDictionary *dict1 = [NSMutableDictionary new];
NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
NSMutableDictionary *dict4 = [NSMutableDictionary dictionaryWithObjectsAndKey:@"james",@"names",@"GD",@"address",nil];//值+键,值+键
// 简要创建方式不行,参考上面
NSMutableDictionary *dict5 = @{}; // 达咩!
NSMutableDictionary新增和删除
// 添加,如果重复替换原有的
- (void)setObject:(ObjectType)anObject forKey:(KeyType<NSCopying>)aKey;
[dict setObject:@"gd" forKey:@"address"];
// 升级版,可以传递路径
[dict setObject:@"gd" forKeyPath:@"dog.name"];
// 删除
-(void)removeAllObjects; // 删除所有
-(void)removeObjectForKey:(KeyType)aKey; // 删除指定的键值对
对象转字典
NSDictionary *dict = [p1 dictionaryWithValuesForKeys:@[@"name",@"age",@"email"]];
写进文件和读出
// 写
-(BOOL)wirteToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
[dist wirteToFile:@"/Users/Apple/Desktop/dist.plist" atomically:NO];
// 读
+(nullable NSDictionary<KeyType,ObjectType> *)dictionaryWithContestsOfFile:(NSString *)path;
NSDictionary *dict = [NSDictionary dictionaryWithContestsOfFile:@"/Users/Apple/Desktop/dist.plist"];
NSNumber
Foundation
框架中的一个类,用于存储基本数据类型,可用于存进NSArray
// 使用方法
NSNumber *number1 = [NSNumber numberWithInt:5];
NSNumber *number2 = [NSNumber numberWithInt:10];
NSArray *arr = @[number1,number2];
for(NSNumber *num in arr) {
NSLog(@"%d",num.intValue);
}
// 简化
NSNumber *number3 = @10;
// 默认调用NSNumber
NSArray *arr = @[@10,@20];
// 还可以
int num = 10;
NSNumber *n1 = @(num); // 小括号不能丢,变量需要常量可以不要
NSPredicate谓词
谓词 NSPredicate
通常与集合类(如NSArray
和NSSet
)一起使用,根据条件进行过滤集合中的对象
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, assign) BOOL isEmployed;
@end
// 创建一个 Person 对象数组
Person *person1 = [[Person alloc] init];
person1.name = @"Alice";
person1.age = 25;
person1.isEmployed = YES;
Person *person2 = [[Person alloc] init];
person2.name = @"Bob";
person2.age = 30;
person2.isEmployed = NO;
Person *person3 = [[Person alloc] init];
person3.name = @"Charlie";
person3.age = 35;
person3.isEmployed = YES;
NSArray *people = @[person1, person2, person3];
// 使用谓词过滤出已就业的人员
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isEmployed == YES"];
NSArray *employedPeople = [people filteredArrayUsingPredicate:predicate];
for (Person *person in employedPeople) {
NSLog(@"Name: %@, Age: %ld", person.name, (long)person.age);
}
// 输出:
// Name: Alice, Age: 25
// Name: Charlie, Age: 35