object-c新特性
继swfit2.0发布后,今年的WWDC介绍了几个object-c的新特性,虽然是看似都是为了配合swift的语言混合编程,但是还是有不少小惊喜。
1,Nullability
其实Xcode 6.3就已经支持了该特性,类似于swift中的Optional,object-c没有提供?和!的支持,但是新增了以下两个关键字:
@property (nonatomic, strong, nonnull) Sark *sark;
@property (nonatomic, copy, readonly, nullable) NSArray *friends;
+ (nullable NSString *)friendWithName:(nonnull NSString *)name;
nonnull:是不可为空
nullable:可为空
如果用来修饰变量前边还需加上__
- (void)startWithCompletionBlock:(nullable void (^)(NSError * __nullable error))block;
除了以上两个还有一个关键字为:null_resettable
表示为 setter nullable, getter nonnull 最直观例子就是 UIViewController 中的 view 属性
#@property (null_resettable, nonatomic, strong) UIView *view;
它可以被设成 nil,但是调用 getter 时会触发 -loadView
从而创建并返回一个非 nil 的 view。
2, Generics 泛型的支持
带泛型的容器
NSArray<NSString *> *strings = @[@"sun", @"yuan"];
NSDictionary<NSString *, NSNumber *> *mapping = @{@"a": @1, @"b": @2};
如果你试图向strings 存放非NSString类型 则会出现编译错误,当然当你获取strings的元素时返回给你的就是NSString类型,无需类型转换就可以使用。
自定义泛型类
@interface Stack<T> : NSObject
- (void)pushObject:(T)object;
- (ObjectType)popObject;
@property (nonatomic, readonly) NSArray<T> *allObjects;
这个 T
是传入类型的 placeholder,它只能在 @interface 上定义(类声明、类扩展、Category),我们还可以给 ObjectType 增加类型限制,比如:
// 只接受 NSNumber * 的泛型
@interface Stack<T: NSNumber *> : NSObject
// 只接受满足 NSCopying 协议的泛型
@interface Stack<T: id<NSCopying>> : NSObject
__kindof
@property (nonatomic, readonly, copy) NSArray<__kindof UIView *> *subviews;
UIButton *button = view.subviews.lastObject;
上面的代码不会出现编译错误,id虽然也能解决但是不能为使用者指明类型,__kindof很好的解决了这类问题,既明确表明了返回值,又让使用者不必写强转。
参考:http://blog.sunnyxx.com/2015/06/12/objc-new-features-in-2015/