一、常见关键字
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];
}