object-c新特性

作者: sprint | 来源:发表于2015-10-21 17:28 被阅读130次

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

    相关文章

      网友评论

        本文标题:object-c新特性

        本文链接:https://www.haomeiwen.com/subject/fzcthttx.html