OC泛型简单应用

从 Xcode 7 以后 Objective-C支持了泛型 (Generics) 的使用。
泛型就是没有规定类型,在使用的时候决定类型。

语法:类型<限制类型>。如:NSArray

使用场景

1.在集合(数组,字典,NSSet)中使用泛型比较常见。
2.当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型。

泛型的作用

  • 限制集合的元素的类型。提高代码规范,减少沟通成本。

如:创建一个只能存放NSString类型的数组

NSMutableArray< NSString *> *array = [NSMutableArray array];

如:声明一个只能存放UIViewController类型的数组属性

@property (nonatomic, copy) NSArray *viewControllers;

这里的数组,元素确定是UIViewController类型,如果你在添加元素时不是UIViewController类型就会有警告。另外,它的子类也会有警告,这个时候就需要用到__kindof关键字。

@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;

__kindof:作用就是扩展泛型,让泛型支持子类。

这样写了之后,即使在数组中添加了UIViewController子类也不会有警告。

  • 方便访问集合的对象属性
@property (nonatomic,strong) NSArray  *dataSource;

没有泛型,要访问一个数组内部对象的属性,只能通过 getter,不能使用点语法,因为通过 index 取的返回值是 id 类型。

使用泛型后,返回值的类型是确定的。可以点语法直接访问元素的属性。

float p = self. dataSource[0].price;

泛型+协议

如果声明泛型时,同时希望对象响应特定的方法/属性,那么可以在泛型上附加协议。

@protocol SomeProtocol 

@property (nonatomic, copy) NSString *name;
@end

...

@interface ViewController ()

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSArray  *> *array;

// 调用
- (void)useGenericProtocol {
    NSString *name = self.array.firstObject.name;
    NSLog(@"name-> %@", name);
}

@end

你可能感兴趣的:(OC泛型简单应用)