利器集合语言特性

object-c新特性

2015-10-21  本文已影响130人  sprint

继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/

上一篇下一篇

猜你喜欢

热点阅读