美文网首页
iOS9 新特性(20180325)

iOS9 新特性(20180325)

作者: 小的小碰撞 | 来源:发表于2018-03-25 18:02 被阅读0次

1.关键字

  • 关键字:可以用于属性,方法返回值和参数中
  • 关键字的作用:提示作用,告诉开发者属性信息
  • 关键字好处:提高代码规范,减少沟通成本
  • 关键字仅仅提供警告,不会报编译错误。因为oc是弱语法,swift是强语法,语法要求很严格。

nullable

  • nullabel 字面意思:可能为空
  • 如下的写法:
// 1
@property (nonatomic, strong, nullable) NSString *name;
// 2
@progerty(nonatomic,strong) NSString * _Nullable name;
// 3
@property (nonatomic, strong) NSString * __nullable name;

nonnull

  • nonnull 字面意思:不能为空
  • 如下写法:
// 1
@property (nonatomic, strong, nullable) NSString *name;
// 2
@property (nonatomic, strong) NSString * _Nonnull name;
// 3
@property (nonatomic, strong) NSString * __nonnull name;
  • 注意点:如下写法能看懂
    • 在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间默认是nonnull
    • 关键字不能用于基本数据类型(int ,float),nil只用于对象

null_resettable

  • null_resettable :必须要处理为空情况,重写get方法
  • nul_resettable作用:get方法不能返回为nil,set方法可以传空。
  • 如下写法:
@property (nonatomic, strong, null_resettable) NSString *name;

// 此时需要重写get方法
- (NSString *)name
{
    if (_name == nil) {
        _name = @"";
    }
    return _name;
}

- (UIView *)view
{
    if (_view == nil) {
        [self loadView];
        [self viewDidLoad];
    }
    return _view
}

_Null_unspecified

  • _Null_unspecified 不确定是否为空

2.泛型 限制类型

  • 泛型作用:
    • 限制类型
    • 提高代码规划,减少沟通成本,一看就知道集合中是什么东西
  • 泛型好处:
    • 1.从数组中取出来,可以使用点语法
    • 2.给数组添加元素,有提示
  • 泛型定义用法: 类型<限制类型>
NSMutableArray<ObjectType> 
(NSSet<UITouch *> *)
  • 泛型声明:在声明类型的时候,在类的后面<泛型名称>
@property (nonatomic, strong) NSMutableArray<NSString *> *arr;
  • 泛型在开发中使用场景:用于限制集合类型

如何声明一个泛型

  • 什么时候使用泛型?
    • 在声明类的时候,不确定某些属性或者犯法类型,在使用这个类的时候才确定,就可以使用泛型
  • 自定义泛型
    • 自定义Person,会一些语言(iOS,java),在声明Person,不确定这个人会什么,在使用person才知道这个Person会那些语言
// Person
#import <Foundation/Foundation.h>

@interface Person<ObjectType> : NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end
// Langeuage
#import <Foundation/Foundation.h>

@interface Language : NSObject

@end

// iOS
#import "Language.h"

@interface iOS : Language

@end
// Java
#import "Language.h"

@interface Java : Language

@end
  • 具体使用

    Java *java = [[Java alloc]init];
    iOS *ios = [[iOS alloc]init];
    
    // 首先当我们什么类型都不指定的时候,泛型默认是id
    Person *p = [[Person alloc]init];
    // p.language == ios 或者java 都行这个时候是 id
    p.language = ios;
    p.language = java;
    
    
    // java
    Person <Java *>*p1 = [[Person alloc]init];
    // 1.如下时,会出现这样的情况:
    // Incompatible pointer types assigning to 'Java *' from 'iOS *'
    // 报告类型不匹配的错误
    // p1.language = ios;
    
    // 2. 正确的写法,应该是这样的
    p1.language = java;
  • 泛型的父子类型转换
    • __covariant:协变, 子类转父类
   @interface Person<__covariant ObjectType> : NSObject


    iOS *ios = [[iOS alloc] init];
    Language *language = [[Language alloc] init];
    // iOS
    Person<iOS *> *p = [[Person alloc] init];
    p.language = ios;
 
    // Language
    Person<Language *> *p1;
    p1 = p;
  • __contravariant:逆变 父类转子类
    @interface Person<__contravariant ObjectType> : NSObject

    iOS *ios = [[iOS alloc] init];
    Language *language = [[Language alloc] init];

    Person<Language *> *p = [[Person alloc] init];
    p.language = language;
    
    // iOS
    Person<iOS *> *p1 = [[Person alloc] init];
    p1 = p;

相关文章

网友评论

      本文标题:iOS9 新特性(20180325)

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