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关键字的更多相关文章

  1. ES6 — 新增关键字let、const

    ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScri ...

  2. ES6新增关键字let与var的区别

    最近看了很多文章,偶然间看到ES6中新增了一个关键字 let ,它具有与 var 关键字相似的功能.一开始使用它时,发现它让我对之前一些习以为常的东西产生了怀疑. 下面先让我们看看它和 var 之间用 ...

  3. iOS开发——新特性OC篇&Objective新特性

    Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...

  4. 前端学PHP之面向对象系列第四篇——关键字

    × 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...

  5. 前端学PHP之面向对象系列第四篇-----关键字

    public public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问 如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有 <?php ...

  6. ES6新语法之let关键字;有别于传统关键字var的使用

    ES6新语法于2015年发布:而我这个前端小白在17年才接触到.惭愧惭愧!!不过到目前为止,似乎只有FireFox和Chrome对ES6的支持相对良好.不过既然人家ES6已经出来了,还是要跟上技术的潮 ...

  7. c++——register关键字、struct类型、bool关键字、三目运算符

    register关键字增强 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容 /* //1 r ...

  8. Linux日志中如何查找关键字及其前后的信息

    在日常工作中,我们经常需要查看日志,比如可以通过 tail 命令实时查看日志,也可以通过 cat 等命令查看日志信息. 但现在我们要讨论的是,如何从日志中通过关键字过滤出我们想要的内容,方法有多种,今 ...

  9. 简述ECMAScript6新增特性

    1.变量 var 可以重复声明.只有函数级的作用域.存在变量提升 let 不能重复声明.有块级作用域.没有变量提升.变量 const 不能重复声明.具有块级作用域.常量 2.箭头函数 a.为了方便而存 ...

随机推荐

  1. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  2. Four subspaces - Prof. Strang

    相应地,用映射的观点考察映射σ的kernal space与image space,得到的就是下面这张图啦 Ref: Introduction to Linear Algebra 5th Edition ...

  3. python+BeautifulSoup+多进程爬取糗事百科图片

    用到的库: import requests import os from bs4 import BeautifulSoup import time from multiprocessing impor ...

  4. linux Crontab定时备份项目案例

    首先先写好备份的脚本(拷贝的命令) #bash/bin cd /finance/tomcat8-finance/wtpwebapps tar -czf /finance/webapp_backup/* ...

  5. linux中的操作记录

    在hadoop上运行jar文件:hadoop jar xxx.jar main路径 命令模式: 1.dd 删除光标所在的当前行 2.Ctrl+u 删除光标所在行光标之前的内容 3.命令模式下,按‘/’ ...

  6. lambda表达式格式以及应用场景?

    lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. add = lambda x, y : x+y print(add(1,2)) # 结果为3 应 ...

  7. 验证符号文件的又一方法(!itoldyouso)

    如果您正在开发软件,很可能遇到了“不匹配的PDB”调试器错误.当您将调试器指向错误的符号路径时,通常会发生这种情况. 但有时你确信你所指向的符号是正确的符号,这让你想知道为什么调试器认为这些符号不匹配 ...

  8. .NET Core入门程序及命令行练习

    用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运行机制. 准备工作 安装.NET Core 运行环境,下载地址 ...

  9. [RN] React Native 使用 react-native-vector-icons 图标显示问号

    我在第一次使用 react-native-vector-icons 时图标显示问号 后来在网上查了很多文章,发现原因有两个 1)安装完 react-native-vector-icons 后,没有li ...

  10. sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock

    原因:历史软件(包)更新(安装)未完成就退出了系统 解决办法:杀死该进程 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock ...