iOS开发之OC入门(NSArray、NSDictionary、NSNumber、谓词NSPredicate)

NSArray

Foundation框架中的一个类,这个类的对象是用来存储多个数据,具备数组的功能,所以NSArrayOC 中的数组

  • 只能存储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 通常与集合类(如NSArrayNSSet)一起使用,根据条件进行过滤集合中的对象

@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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值