从 Xcode 7 以后 Objective-C
支持了泛型 (Generics)
的使用。
泛型就是没有规定类型,在使用的时候决定类型。
语法:类型<限制类型>。如:NSArray<NSString *>
使用场景
1.在集合(数组,字典,NSSet)中使用泛型比较常见。
2.当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型。
泛型的作用
- 限制集合的元素的类型。提高代码规范,减少沟通成本。
如:创建一个只能存放NSString
类型的数组
NSMutableArray< NSString *> *array = [NSMutableArray array];
复制代码
如:声明一个只能存放UIViewController
类型的数组属性
@property (nonatomic, copy) NSArray<UIViewController *> *viewControllers;
复制代码
这里的数组,元素确定是UIViewController
类型,如果你在添加元素时不是UIViewController
类型就会有警告。另外,它的子类也会有警告,这个时候就需要用到__kindof
关键字。
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;
复制代码
__kindof:作用就是扩展泛型,让泛型支持子类。
这样写了之后,即使在数组中添加了UIViewController
子类也不会有警告。
- 方便访问集合的对象属性
@property (nonatomic,strong) NSArray <PDCar *> *dataSource;
复制代码
没有泛型,要访问一个数组内部对象的属性,只能通过 getter
,不能使用点语法,因为通过 index 取的返回值是 id 类型。
使用泛型后,返回值的类型是确定的。可以点语法直接访问元素的属性。
float p = self. dataSource[0].price;
复制代码
泛型+协议
如果声明泛型时,同时希望对象响应特定的方法/属性,那么可以在泛型上附加协议。
@protocol SomeProtocol <NSObject>
@property (nonatomic, copy) NSString *name;
@end
...
@interface ViewController ()
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSArray <UIViewController <SomeProtocol> *> *array;
// 调用
- (void)useGenericProtocol {
NSString *name = self.array.firstObject.name;
NSLog(@"name-> %@", name);
}
@end
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END