iOS新特性

/* 
    新出的关键字:修饰属性,方法的参数,方法返回值,规范开发。
 
    好处:
        1.提高程序员规范,减少交流成本,程序员一看,就知道怎么赋值。
    注意:只能用于声明对象,不能声明基本数据类型,因为只有对象才能为nil。
 
    nonnull:表示属性不能为空,non:非,null:空
    方式一:
    @property (nonatomic, strong, nonnull) NSString *name;
    方式二:
    @property (nonatomic, strong) NSString * _Nonnull name;
    方式三:
    @property (nonatomic, strong) NSString * __nonnull name;
 
    在NS_ASSUME_NONNULL_BEGIN与NS_ASSUME_NONNULL_END之间所有的对象属性,方法参数,方法返回值,默认都是nonnull。
 
     NS_ASSUME_NONNULL_BEGIN
     
     @property (nonatomic, strong) NSString *name;
     
     NS_ASSUME_NONNULL_END
 
 */

/*
    nullable:可以为nil
     方式一:
     @property (nonatomic, strong, nullable) NSString *name;
     方式二:
     @property (nonatomic, strong) NSString * _Nullable name;
     方式三:
     @property (nonatomic, strong) NSString * __nullable name;
 
 */


/*
     null_resettable:可以重新设置空,set方法可以为空,get不能为空。
     方式一:
     @property (nonatomic, strong, null_resettable) NSString *name;
     注意:用null_resettable属性,必须重写set,或者get方法,处理传值为nil的情况,可以模仿控制器view的get方法,当view为nil,就自己创建一个.
 */

/*
    _Null_unspecified:不确定是否为空.
 
    方式一:
    @property (nonatomic, strong) NSString * _Null_unspecified name;
 
 */

@property (nonatomic, strong ,nonnull) NSString *name;

@property (nonatomic, strong ,nullable) NSString *icon;

@property (nonatomic, strong ,null_resettable) NSString *text;


@end

@implementation ViewController

- (NSString *)text
{
    if (_text == nil) {
        _text = @"我不能为空";
    }
    return _text;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
}
#import "ViewController.h"

#import "Person.h"

#import "IOS.h"
#import "Java.h"

@interface ViewController ()

// 定义泛型:确定类型
@property (nonatomic, strong) NSMutableArray *array;

@end

@implementation ViewController

// 泛型:限制类型

// 开发中使用场景:
//  * 限制集合中的类型,注意:只能检测方法的调用,因为声明的泛型,只能放在方法中
//  * 当一个类在声明的时候,某个对象的属性不确定,只有创建对象的时候才确定,可以使用泛型

// 泛型书写格式:放在类型后面,表示限制这个类型.

// 好处:
// 提高程序员开发规范,减少交流成本。
// 从数组或者字典取值,都是id类型,不能调用点语法,但是使用泛型,就可以了。

// 自定义泛型:模仿数组

// 需求:假设有个Person,这个人会编程语言,但是在定义的时候不确定,只有在创建对象的时候才确定。
// language属性的类型就有讲究了
// id 类型:表示可以传任何对象
// Launguage类型,在赋值的时候没有提示
// 泛型,声明泛型,在创建对象的时候,确定泛型,在赋值就有提示了。

// 泛型中协变,逆变,用于转换类型
// 默认带有泛型的变量,互相赋值有报警告,使用协变,逆变,就能解决.
// 协变(__covariant): 向上转型, 子类转父类
// 逆变(__contravariant):向下转型 父类转子类




- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Person *person = [[Person alloc] init];

    
//    person.language = [[IOS alloc] init];
    
    Person *person1 = [[Person alloc] init];
    
    person = person1;
    person1 = person;
    
//    person1.language = [[Language alloc] init];
    
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
}

// __kindof:相当于,表示某个类或者他的子类。
// 设计模型中可以使用,当给某个类提供类方法,想让外界调用能看到创建什么对象,并且不报警告。

  • (void)viewDidLoad {
    [super viewDidLoad];

    SonPerson *person = [SonPerson person] ;

}

你可能感兴趣的:(iOS新特性)