关于Objective-C新增的__kindof关键字
Objective-C随着Xcode 7的升级带来了许多新特性,当然此次更新最最大的就是引入了Objective-C的轻量级泛型,确切地说是Objective-C类的轻量级泛型。除此之外,还有一个小特性就是__kindof关键字的引入。
有些技术网站上声称__kindof一般用于泛型,比如:NSArray<__kindof UIView*>表示在此NSArray对象中存放的是UIView对象或UIView子类对象。不过,由于Objective-C本来就是动态类型,况且编译器也会在编译时做类型匹配,所以即便我们用NSArray<UIView*>也能在此数组中存放UIScrollView的对象,不会有编译警告,更不会报错。那么这个__kindof有啥用呢?
__kindof class_name 本意是将此类型指定为class_name或class_name的子类,告诉编译器这两者均能适配。现在对于编译器类型检查匹配倒是有一种情况存在,即结合C11标准中的泛型一起使用!由于C11中的generic selection表达式中的类型匹配完全由编译器在编译时进行匹配,而不会有任何运行时的动作(除非是动态变长类型,比如int[n]类型),所以这里可以由__kindof class_name 的形式来做一些更宽范围的类型匹配。如以下代码:
@interface MyObject : NSObject
@end
@implementation MyObject
@end
@implementation ViewController
- (void)viewDidLoad {
MyObject *obj = [[MyObject alloc] init];
int x = _Generic(obj, int:, NSString*:, NSObject*:, default:-);
NSLog(@"x1 = %d", x);
x = _Generic(obj, int:, float:, __kindof NSObject*:, default:-);
NSLog(@"x2 = %d", x);
[obj release];
}
@end
正由于编译器会在编译时做检查,所以这里第二个_Generic里就不能用NSString*,否则编译器会认为NSString*与__kindof NSObject*两者是相互兼容的类型,从而会产生匹配歧义。
关于Objective-C新增的__kindof关键字的更多相关文章
- ES6 — 新增关键字let、const
ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScri ...
- ES6新增关键字let与var的区别
最近看了很多文章,偶然间看到ES6中新增了一个关键字 let ,它具有与 var 关键字相似的功能.一开始使用它时,发现它让我对之前一些习以为常的东西产生了怀疑. 下面先让我们看看它和 var 之间用 ...
- iOS开发——新特性OC篇&Objective新特性
Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...
- 前端学PHP之面向对象系列第四篇——关键字
× 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...
- 前端学PHP之面向对象系列第四篇-----关键字
public public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问 如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有 <?php ...
- ES6新语法之let关键字;有别于传统关键字var的使用
ES6新语法于2015年发布:而我这个前端小白在17年才接触到.惭愧惭愧!!不过到目前为止,似乎只有FireFox和Chrome对ES6的支持相对良好.不过既然人家ES6已经出来了,还是要跟上技术的潮 ...
- c++——register关键字、struct类型、bool关键字、三目运算符
register关键字增强 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容 /* //1 r ...
- Linux日志中如何查找关键字及其前后的信息
在日常工作中,我们经常需要查看日志,比如可以通过 tail 命令实时查看日志,也可以通过 cat 等命令查看日志信息. 但现在我们要讨论的是,如何从日志中通过关键字过滤出我们想要的内容,方法有多种,今 ...
- 简述ECMAScript6新增特性
1.变量 var 可以重复声明.只有函数级的作用域.存在变量提升 let 不能重复声明.有块级作用域.没有变量提升.变量 const 不能重复声明.具有块级作用域.常量 2.箭头函数 a.为了方便而存 ...
随机推荐
- maven学习笔记二(了解maven的基本命令)
maven常用的命令 mvn archetype:create 创建Maven项目 mvn compile 编译源代码 mvn deploy 发布项目 mvn test-compile 编译测试源代码 ...
- H3C 802.11 MAC层工作原理
- 拿webshell方法汇总
地址:https://blog.csdn.net/Breeze_CAT/article/details/80044676
- 项目Alpha冲刺--6/10
项目Alpha冲刺--6/10 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Alpha冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合 ...
- pandas 筛选
t={ , , np.nan, , np.nan, ], "city": ["BeiJing", "ShangHai", "Gua ...
- spring jar包的作用
spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...
- Mybatis框架-@Param注解
回顾一下上一个小demo中存在的问题,是是根据用户的id修改用户的密码,我们只是修改了用户的密码,结果我们的在写接口方法的时候掺入的参数确实一个User对象,这样让别人看到我们的代码真的是很难读懂啊! ...
- 11、 Hadoop 2.x各个服务组件如何配置在那台服务器运行并测试
HDFS模块 NameNode:是由哪个文件中的哪个配置属性指定的呢? core-site.xml文件中: <property> <name>fs.defaultFS</ ...
- 利用dnslog进行sql注入
更多内容,欢迎关注微信公众号:信Yang安全,期待与您相遇. 能够利用dnslog进行注入的两个关键点:secure_file_priv 不能为NULL,仅支持 Windows但不支持 Linux s ...
- 单页面应用程序(SPA)
一.概念 ①在一个页面上实现网站的大部分功能,就是单页面应用程序,是一种常见的网页开发模式. ②整个网站就只有一个Html文件,每次在切换页面时,不需要请求服务器,只要通过本地的js来切换即可.这样可 ...