iOS9关键字的简单使用
在iOS 9 苹果推出了很多关键字, 目的其实很明确, 主要就是提高开发人员的效率, 有益于程序员之间的沟通与交流, 在开发中代码更加规范!
1. nullable 与 nonnull
nullable : 表示可以为 nil
nonnull : 表示不可以为 nil
这两个关键字只能修饰对象, 不能修饰基本数据类型, 可以用在属性, 方法的参数, 方法的返回值使用, 在默认情况下, 不加nullable, setter 和 getter 都是可以为nil
我们来看下如何使用, 以nullable为例如下:
@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; |
在方法中怎么使用呢? 我们来看看:
- (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个宏如下:
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方法. 目的是为了处理值为空的情况
使用方法如下:
|
1
|
@property
(nonatomic, strong, null_resettable) UIView *testView; |
关键字: _Null_unspecified
不确定是否为空, 此关键字个人感觉意义不是很大, 因为对象属性默认就是不确定的
使用方法如下:
@property (nonatomic, strong) UIView * __null_unspecified testView;
|
1
2
|
@property
(nonatomic, strong) UIView * _Null_unspecified testView;
@property
(nonatomic, strong) UIView * __null_unspecified testView; |
2. 泛型
通过使用泛型, 我们可以非常容易地获取其中的元素,并访问其特有的属性和方法, 一般使用在集合中使用(例如:数组,字典), 当方法调用的时候才有效果, 我们来看看如何使用:
@property (nonatomic, strong) NSMutableArray *testArrayM;
//在方法中使用
- (NSArray *)testStringArray:(NSArray *)stringArray;
|
1
2
3
4
|
//属性使用
@property (nonatomic,
strong) NSMutableArray *testArrayM; //在方法中使用
- (NSArray
*)testStringArray:(NSArray *)stringArray; |
我们在数组中使用泛型, 之后我们可以很明确知道数组中是什么类型如下图:


并且在上图我们可以了解到, 在集合里规定对象的类型, 通过集合取出来的对象可以当做泛型来使用, 并且可以直接用点语法, 可想而知泛型的好处是非常强大的!
协变/逆变
- __covariant: 协变, 用于数据强制转换类型(子类可以转变父类)
- __contravariant :逆变, 用于数据强制转换类型(父类可以转变子类)
3. __kindof
表示当前类, 或者它的子类(__kindof使用: 放在类型前面, 表示修饰此类型)
我们先从 id 开始说起
- 最开始我们方法的返回值不确定,我们会使用 id 但是使用它会有不好之处, id在编译的时候不能检查真实类型, 并且返回值没有提示
|
1
|
-
(id)testStringArray:(NSArray *)stringArray; |

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

- 最后苹果推出了 __kindof 它在调用时候很清楚的知道返回的类型, 在我们之前很多地方需要强制类型转换, 有了它就方便了很多
|
1
|
-
(__kindof NSArray *)testStringArray:(NSArray *)stringArray; |

iOS9关键字的简单使用的更多相关文章
- 封装和private,this,super关键字的简单应用
1.将成员变量用private修饰 2.提供对应的getxx()和setxx()方法 public class Student { private String name; private int a ...
- iOS 9 关键字的简单使用
前言: 在iOS 9 苹果推出了很多关键字, 目的其实很明确, 主要就是提高开发人员的效率, 有益于程序员之间的沟通与交流, 在开发中代码更加规范! 1. nullable 与 nonnull nul ...
- C#中await和async关键字的简单理解
C# 5.0之后,为了简化异步编程,引入了异步函数的概念,也就是方法标记async,然后可以使用await表达式来等待异步操作返回. await关键字看起来是一个阻塞线程的调用,但是实际上执行到awa ...
- c#基础学习(0806)之可变参数、ref和out关键字的简单使用
params可变参数: 1.无论方法有几个参数,可变参数必须出现再参数列表的最后,可以为可变参数直接传递一个对应类型的数组: 2.可变参数可以传递参数也可以不传递参数,如果不传递参数,则数组为一个长度 ...
- golang 关键字以及简单用法说明
golang只有25个关键字 package: 定义包名, go中任何一个文件必须有一个package, 一般而言,package的定义和文件所属文件夹一致, 并且main函数所在文件的package ...
- python 定义函数关键字def 简单介绍
一 在类中定义的def # python中def 是用来干什么的? # 可以定义函数,就是定义一个功能. class People(): def __init__(self): print(&quo ...
- Java中的yield关键字的简单讲解
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程. yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会.因此,使用yie ...
- final关键字的简单理解
final可以修饰类,方法,变量. 1.final修饰的类,不可以被继承. 2.final修饰方法,可以把方法锁定,以防任何继承类修改它的含义. 3.fianl修饰的变量,如果是基本数据类型的变量,则 ...
- ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...
随机推荐
- 2018 dnc 公司案例大全,迎接.NET Core开源新时代
2018 dnc 公司案例大全,迎接.NET Core开源新时代 dnc = .NET Core.dotnet Core dnc是微软新一代主力编程平台,开源.免费.跨平台.轻量级.高性能,支持L ...
- Docker镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去. 通常 Union FS 有两个用途, 一方面可以实 ...
- Netty 4源码解析:请求处理
Netty 4源码解析:请求处理 通过之前<Netty 4源码解析:服务端启动>的分析,我们知道在最前端"扛压力"的是NioEventLoop.run()方法.我们指定 ...
- 六星经典CSAPP-笔记(7)加载与链接(上)
六星经典CSAPP-笔记(7)加载与链接 1.对象文件(Object File) 1.1 文件类型 对象文件有三种形式: 可重定位对象文件(Relocatable object file):包含二进制 ...
- Spark-SQL之DataFrame操作大全
Spark SQL中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现.可以参考,Scala提供的DataFra ...
- 网络爬虫框架Scrapy简介
作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...
- TensorFlow与OpenCV,读取图片,进行简单操作并显示
TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...
- [lua]luasocket.c:20:17: fatal error: lua.h: No such file or directory
安装luasocket的时候出现了如下的错误 问题 $ tar xzf luasocket-2.0.2.tar.gz $ cd luasocket-2.0.2 $ $ make cd src; mak ...
- EJB_开发单表映射的实体bean
开发单表映射的实体bean 实体bean 它属于java持久化规范(JPA)里的技术,实体bean通过元数据在Javabean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对 ...
- 浅谈Android布局
在前面的博客中,小编介绍了Android的极光推送以及如何实现登录的一个小demo,对于xml布局页面,摆控件这块的内容,小编还不是很熟练,今天小编主要简单总结一下在Android中的布局,学习过An ...