iOS9新特性常用关键字和泛性

一、常见关键字

xcode7 ,ios9为了迎合swift,新出了一些关键字:nullable、nonnull、null_resettable可以运用于属性,方法返回值和参数中。 这些关键字的好处是:提高代码规划,减少沟通成本。关键字仅仅是提供警告,并不会报编译错误

  • 1、修饰属性
@interface ViewController ()

//默认情况下,不加nullable,setter和getter可以为nil,nullable更多的作用在于程序员之间的交流(提醒同事某个属性可能为nil)
@property(nonatomic,strong)NSArray *  array5;


//nonull属性修饰,setter和getter都不能为nil
@property(nonatomic,strong,nonnull)NSArray *array1;

//nonull属性修饰,setter和getter都不能为nil
@property(nonatomic, strong) NSString * __nonnull str3;
@property(nonatomic, strong,nonnull) NSString  * str4;
@property(nonatomic, strong) NSString * _Nonnull str5;

//nullable属性修饰,setter和getter可以为nil
@property(nonatomic, strong) NSString * __nullable str;
@property(nonatomic, strong,nullable) NSString  * str1;
@property(nonatomic, strong) NSString * _Nullable str2;

NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, strong) NSString  * str7;
@property(nonatomic, strong) NSString *  str6;
NS_ASSUME_NONNULL_END
//在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间默认是nonnull

//nullable属性修饰,setter可以为nil,get不可以为nil
@property(null_resettable,nonatomic,strong)NSArray * array6;

//错误写法:
 @property(nonatomic, assign,nullable) int a;
 @property(nonatomic, assign,nullable) NSInteger a;
 @property(nonatomic, assign,nonnull) CGFloat a;
 //nonull、nullable、null_resettable是用来修饰oc对象的,不能用于基本类型

//resettable作用:get方法不能返回nil,set可以传入为空
@property(nonatomic, strong,null_resettable) NSString *  str9;

 - (void)test1name:(NSString *__nonnull)name;
@end
- (void)test1name:(NSString *__nonnull)name{
    NSLog(@"参数值不能为nil");
}
  • 2、修饰参数
- (void)test:(NSString * __nonnull)str{
    
}
- (void)test2:(NSString * _Nonnull)str{
    
}
- (void)test3:(NSString * __nullable)str{
    
}
- (void)test4:(NSString * _Nullable)str{
    
}
  • 3、修饰返回值
- (NSString * __nonnull)test5{
    return @"11";
}
- (NSString * _Nonnull)test6{
    return @"11";
}
- (NSString * __nullable)test7{
    return nil;
}
- (NSString * _Nullable)test8{
    return nil;
}

二、泛性

泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西
泛型定义用法:类型<限制类型>
泛型好处:1.从数组中取出来,可以使用点语法
2.给数组添加元素,有提示.

  • 1、泛性集合的使用
#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong)NSMutableArray *array1;

@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.array1=[NSMutableArray array];
    [self.array1 addObject:@"1"];
    [self.array1 addObject:@"2"];
    NSInteger length1=[self.array1.lastObject length
  • 2、自定义泛性
    在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型
#import 

@interface Person : NSObject

@end

#import 

@interface Langue : NSObject

@end

@interface Ios : NSObject

@end

@interface Java :NSObject

@end

2.1、声明一个泛性

@interface Person : NSObject
@property(nonatomic, strong)ObjectType language;;
@end

2.2、使用泛性

    Java *java =[[Java alloc]init];
    Ios *ios =[[Ios alloc]init];

   //01、未使用泛性
    Person *p =[[Person alloc]init];
    p.language = ios;
    p.language =java;//没有定义泛型.langue类型就是id
 
 //02、使用泛性限制langue类型是ios
    Person*p1 =[[Person alloc]init];
    p1.language = ios;
    
    使用泛性限制langue类型是java
    Person*p2 =[[Person alloc]init];
    p2.language = java;

三、kindof相当于

__kindof:相当于,表示当前类或者它的子类'

+ (id)person1{
    return [[self alloc]init];
}

返回的对象是id,id可以发送任何消息.
    id p1 = [Person person1];
    [p1 length];
    [p1 count];
    [p1 string];
类似以上的调用编译是通过的,运行后就会找不到方法而崩溃。
+ (instancetype)person2{
    return [[self alloc]init];
}
instancetype可以自动识别当前返回类当前的对象,[Person person2]返回的就是一个Person实例,不会再向id一样可以发送各种找不到的方法。
+ (__kindof Person*)person3{
    return [[self alloc]init];
}

iOS9新特性常用关键字和泛性_第1张图片
屏幕快照 2018-08-22 下午1.52.24.png

你可能感兴趣的:(iOS9新特性常用关键字和泛性)