1.OC泛型数组的意义:
- OC数组可以存放任意类型的对象,但是在开发中,绝大多数是存放相同类型元素,利用泛型数组可以提示开发者添加指定类型对象,否则编译器会立即警告,提前发现错误;
- OC数组中的元素是通过下标获取,并且是id类型,无法通过点语法获取数组内部对象的属性,定义了泛型数组之后就可以通过点语法直接取出数组内部元素的属性;
2.OC泛型数组的定义
1)为person对象定义两个属性,定义对应利用字典给属性赋值的方法并完成实现
a.定义属性和方法
#import <Foundation/Foundation.h>
@interface Person : NSObject
/**
姓名
*/
@property (nonatomic,copy) NSString *name;
/**
年龄
*/
@property (nonatomic,assign) NSInteger age;
+ (instancetype)personWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict;
@end
b.实现
#import "Person.h"
@implementation Person
+(instancetype)personWithDict:(NSDictionary *)dict
{
return [[self alloc]initWithDict:dict];
}
-(instancetype)initWithDict:(NSDictionary *)dict
{
self = [super init];
if (self) {
// KVC大招
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
@end
c.定义Person对象并设置属性
// 定义字典
NSDictionary *dict1 = @{@"name":@"lisi",@"age":@10};
NSDictionary *dict2 = @{@"name":@"zhangsan",@"age":@20};
// 字典转模型
Person *p1 = [Person personWithDict:dict1];
Person *p2 = [Person personWithDict:dict2];
2)首先导入Person类型头文件,定义一个普通数组arrayM1,定义一个泛型数组arrayM2
// 默认情况下,OC数组可以存放任意类型的对象
NSMutableArray *arrayM1 = [NSMutableArray array];
// 定义泛型数组, <Person *> 表示数组中只存放 Person 对象
// 定义了泛型数组之后,如果添加的对象和指定类型不匹配,会提示错误
NSMutableArray <Person *>*arrayM2 = [NSMutableArray array];
3.对比普通数组与泛型数组区别
1)将模型对象添加到数组中
[arrayM1 addObject:p1];
[arrayM2 addObject:p2];
2)当添加其他类型(举例:按钮)的对象到数组当中时,泛型数组会提示错误
// 添加一个其他类型到数组中
UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
// 定义了泛型数组之后,如果添加的对象和指定类型不匹配,会立即警告,可以提前发发现错误
[arrayM1 addObject:btn];
[arrayM2 addObject:btn];
- 提示错误:(按钮不是一个合适的类型)
Incompatible pointer types sending 'UIButton *' to parameter of type 'Person * _Nonnull'
3)普通数组通过下标访问数组内部元素属性,泛型数组通过点语法访问数组内部元素属性
-
xcode7.0之前,要取属性,需要发送消息的方式,因为可以给id类型发送任意消息,但是不可以使用点语法,id类型对象不可以使用点语法
NSString *name = [arrayM1[0] name];定义了泛型数组之后可以使用点语法直接取出数组内部属性
NSInteger age = arrayM2[0].age;
网友评论