在iOS 9 苹果推出了很多关键字, 目的其实很明确, 主要就是提高开发人员的效率, 有益于程序员之间的沟通与交流, 在开发中代码更加规范!

1. nullable 与 nonnull

nullable : 表示可以为 nil

nonnull : 表示不可以为 nil

这两个关键字只能修饰对象, 不能修饰基本数据类型, 可以用在属性, 方法的参数, 方法的返回值使用, 在默认情况下, 不加nullable, setter 和 getter 都是可以为nil

我们来看下如何使用, 以nullable为例如下:

Objective-C
@property (nonatomic, strong, nullable) NSArray *array;
@property (nonatomic, strong) NSArray * __nullable array;
@property (nonatomic, strong) NSArray * _Nullable array;
1
2
3
@property
(nonatomic,
strong,
nullable)
NSArray *array;
@property (nonatomic,
strong)
NSArray *
__nullable array;
@property
(nonatomic,
strong)
NSArray *
_Nullable array;

在方法中怎么使用呢? 我们来看看:

Objective-C
- (nonnull NSString *)testString:(nonnull NSString *)string;
- (NSString * _Nonnull)testString:(NSString * _Nonnull)string;
- (NSString * __nonnull)testString:(NSString * __nonnull)string;
1
2
3
-
(nonnull NSString
*)testString:(nonnull
NSString *)string;
- (NSString
* _Nonnull)testString:(NSString
* _Nonnull)string;
-
(NSString
* __nonnull)testString:(NSString
* __nonnull)string;

我们在调用属性或者方法时候, 系统会提示你当前的对象是否为nil如下图:

另外还有2个宏如下:
Objective-C
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
1
2
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END

在这两个宏之间的所有对象属性默认都是nonnull

关键字: null_resettable

getter :不可以为nil

setter :可以为nil

如果使用 null_resettable 就必须重写 getter或者setter方法. 目的是为了处理值为空的情况

使用方法如下:

Objective-C
@property (nonatomic, strong, null_resettable) UIView *testView;
1
@property
(nonatomic,
strong,
null_resettable)
UIView *testView;
关键字: _Null_unspecified

不确定是否为空, 此关键字个人感觉意义不是很大, 因为对象属性默认就是不确定的

使用方法如下:

Objective-C
@property (nonatomic, strong) UIView * _Null_unspecified testView;
@property (nonatomic, strong) UIView * __null_unspecified testView;
1
2
@property
(nonatomic,
strong)
UIView *
_Null_unspecified testView;
@property
(nonatomic,
strong)
UIView *
__null_unspecified testView;

2. 泛型

通过使用泛型, 我们可以非常容易地获取其中的元素,并访问其特有的属性和方法, 一般使用在集合中使用(例如:数组,字典), 当方法调用的时候才有效果, 我们来看看如何使用:

Objective-C
//属性使用
@property (nonatomic, strong) NSMutableArray *testArrayM;
//在方法中使用
- (NSArray *)testStringArray:(NSArray *)stringArray;
1
2
3
4
//属性使用
@property (nonatomic,
strong)
NSMutableArray
*testArrayM;
//在方法中使用
- (NSArray
*)testStringArray:(NSArray
*)stringArray;

我们在数组中使用泛型, 之后我们可以很明确知道数组中是什么类型如下图:

在方法中使用泛型.png

在NSMutableArray中使用泛型.png

并且在上图我们可以了解到, 在集合里规定对象的类型, 通过集合取出来的对象可以当做泛型来使用, 并且可以直接用点语法, 可想而知泛型的好处是非常强大的!

协变/逆变
  • __covariant: 协变, 用于数据强制转换类型(子类可以转变父类)
  • __contravariant :逆变, 用于数据强制转换类型(父类可以转变子类)

3. __kindof

表示当前类, 或者它的子类(__kindof使用: 放在类型前面, 表示修饰此类型)

我们先从 id 开始说起

  • 最开始我们方法的返回值不确定,我们会使用 id 但是使用它会有不好之处, id在编译的时候不能检查真实类型, 并且返回值没有提示
Objective-C
- (id)testStringArray:(NSArray *)stringArray;
1
  -
(id)testStringArray:(NSArray
*)stringArray;

返回值使用id没有提示.png
  • 所以苹果出现了 instancetype 它会自动识别当前对象是哪个类, 只能在返回值中使用, 但是在调用方法时候还是不知道返回什么类型
Objective-C
- (instancetype)testStringArray:(NSArray *)stringArray;
1
-
(instancetype)testStringArray:(NSArray
*)stringArray;

instancetype在编译能自动识别类型.png
  • 最后苹果推出了 __kindof 它在调用时候很清楚的知道返回的类型, 在我们之前很多地方需要强制类型转换, 有了它就方便了很多
Objective-C
- (__kindof NSArray *)testStringArray:(NSArray *)stringArray;
1
-
(__kindof NSArray
*)testStringArray:(NSArray
*)stringArray;

__kindof使用.png

iOS9关键字的简单使用的更多相关文章

  1. 封装和private,this,super关键字的简单应用

    1.将成员变量用private修饰 2.提供对应的getxx()和setxx()方法 public class Student { private String name; private int a ...

  2. iOS 9 关键字的简单使用

    前言: 在iOS 9 苹果推出了很多关键字, 目的其实很明确, 主要就是提高开发人员的效率, 有益于程序员之间的沟通与交流, 在开发中代码更加规范! 1. nullable 与 nonnull nul ...

  3. C#中await和async关键字的简单理解

    C# 5.0之后,为了简化异步编程,引入了异步函数的概念,也就是方法标记async,然后可以使用await表达式来等待异步操作返回. await关键字看起来是一个阻塞线程的调用,但是实际上执行到awa ...

  4. c#基础学习(0806)之可变参数、ref和out关键字的简单使用

    params可变参数: 1.无论方法有几个参数,可变参数必须出现再参数列表的最后,可以为可变参数直接传递一个对应类型的数组: 2.可变参数可以传递参数也可以不传递参数,如果不传递参数,则数组为一个长度 ...

  5. golang 关键字以及简单用法说明

    golang只有25个关键字 package: 定义包名, go中任何一个文件必须有一个package, 一般而言,package的定义和文件所属文件夹一致, 并且main函数所在文件的package ...

  6. python 定义函数关键字def 简单介绍

    一  在类中定义的def # python中def 是用来干什么的? # 可以定义函数,就是定义一个功能. class People(): def __init__(self): print(&quo ...

  7. Java中的yield关键字的简单讲解

    Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程. yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会.因此,使用yie ...

  8. final关键字的简单理解

    final可以修饰类,方法,变量. 1.final修饰的类,不可以被继承. 2.final修饰方法,可以把方法锁定,以防任何继承类修改它的含义. 3.fianl修饰的变量,如果是基本数据类型的变量,则 ...

  9. ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

    一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...

随机推荐

  1. 谈谈Circuit Breaker在.NET Core中的简单应用

    前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不了服务之间的相互调用问题!如果调用没有处理好,就有可能造成整个系统的 ...

  2. IDEA中Git的使用

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...

  3. JAVA Eclipse使用Maven构建web项目详解(SSM框架)

    tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...

  4. Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 现在很多的App要么顶部带有tab,要么就底部带有tab.用户通过点击tab从而切换不同的页面(大部分情况时去切换fragment). ...

  5. Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend

    本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...

  6. Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52532085 不知不觉到第九篇了,感觉还有 ...

  7. Java 单元测试 JUnit4 快速入门

    JUnit最佳实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class CardServiceTest {     /**      * 最佳 ...

  8. T-SQL动态查询(3)——静态SQL

    接上文:T-SQL动态查询(2)--关键字查询   本文讲述关于静态SQL的一些知识和基础技巧. 简介: 什么是静态SQL?静态SQL是和动态SQL相对而言的,其实我们没必要过于纠结精确定义,只要大概 ...

  9. scala模式匹配的使用

    Scala模式匹配 Tip1:模式总是从上往下匹配,如果匹配不到则匹配case_项(类似Java中的default) Tip2:与Java和C语言不同,不需要在每个分支末尾使用break语句退出(不会 ...

  10. Android图片setBackgroundResource和setImageResource的区别

    网上对于这2个的区别大都是如下所示: setImageResource與xml中的src的屬性才是相匹配的,而setBackgroundResource是與xml中的background屬性相匹配 的 ...