苹果在 Xcode 6.3 以后,为了解决 Swift 与 OC 混编时的问题,引入了一个 Objective-C 的新特性:nullability annotations。

这一新特性的核心是两个新的类型注释:__nullable 和 __nonnull。从字面上我们可以猜到,__nullable 表示对象可以是 NULL 或 nil,而 __nonnull 表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告(编译器警告:Null passed to a callee that requires a non-null argument)。

引入 nullability annotations  新特性的原因:

在swift中,可以使用 ! 和 ? 来表示一个对象是 optional 的还是 non-optional,如 view! 和 view?,而在 Objective-C 中则没有这一区分,view 即可表示这个对象是optional,也可表示是non-optioanl。

这样就会造成一个问题:在 Swift 与 Objective-C 混编时,Swift 编译器并不知道一个 Objective-C 对象到底是 optional 还是 non-optional,因此这种情况下编译器会隐式地将 Objective-C 的对象当成是 non-optional。

我们来看看以下的实例:

 @interface StudentClass ()

 @property (nonatomic, copy) NSArray *studentArray;

 - (id)studentWithName:(NSString *__nonnull)name;

 @end

 @implementation StudentClass

 - (void)testNullability {
[self studentWithName:nil];
// 编译器警告:Null passed to a callee that requires a non-null argument
} - (id)studentWithName:(NSString *__nonnull)name {
return nil;
} @end
不过这只是一个警告,程序还是能编译通过并运行。
事实上,在任何可以使用 const 关键字的地方都可以使用 __nullable 和 __nonnull,不过这两个关键字仅限于使用在指针类型上。
而在方法的声明中,我们还可以使用不带下划线的 nullable 和 nonnull,如下所示:
- (nullable id)studentWithName:(NSString *nonnull)name;

在属性声明中,也增加了两个相应的特性,因此上例中的 studentArray 属性可以如下声明:

@property (nonatomic, copy, nonnull) NSArray *studentArray;

当然也可以用以下这种方式:

@property (nonatomic, copy) NSArray *__nonnull studentArray;

推荐使用 nonnull 这种方式,这样可以让属性声明看起来更清晰。

不过,为了安全起见,苹果还制定了几条规则:

  1. typedef 定义的类型的 nullability 特性通常依赖于上下文,即使是在 Audited Regions 中,也不能指定它为 nonnull。

  2. 复杂的指针类型(如id *)必须显示去指定是 nonnull 还是 nullable。例如,指定一个指向 nullable 对象的 nonnull 指针,可以使用 "__nullable id *__nonnull"。

  3. 我们经常使用的 NSError ** 通常是被假定为一个指向 nullable NSError 对象的 nullable 指针。

因为 Nullability Annotations 是 Xcode 6.3 新加入的,所以我们需要考虑之前的老代码。实际上,苹果已以帮我们处理好了这种兼容问题,我们可以安全地使用它们:

  1. 老代码仍然能正常工作,即使对 nonnull 对象使用了 nil 也没有问题。

  2. 老代码在需要和 Swift 混编时,在新的 Swift 编译器下会给出一个警告。

  3. nonnull 不会影响性能,事实上,我们仍然可以在运行时去判断我们的对象是否为 nil。

事实上,我们可以将 nonnull/nullable 与我们的断点和异常一起看待,其需要处理的问题都是同一个:违反约定是一个程序员的错误;特别是,返回值是我们可控的东西,如果返回值是 nonnull 的,则我们不应该返回 nil,除非是为了向后兼容。

__nonnull 和 __nullable (Swift 和 Objective-C混编)的更多相关文章

  1. Swift _ OC _ 混编

    Swift _ OC _ 混编 在OC环境下使用Swift. GitHub源码

  2. 详解Swift和OC的混编

    前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...

  3. iOS开发--Swift 如何完成工程中Swift和OC的混编桥接(Cocoapods同样适用)

    由于SDK现在大部分都是OC版本, 所以假如你是一名主要以Swift语言进行开发的开发者, 就要面临如何让OC和Swift兼容在一个工程中, 如果你没有进行过这样的操作, 会感觉异常的茫然, 不用担心 ...

  4. swift和oc的混编

    一.Swift工程中加入oc代码 1.在将oc代码加入到Swift工程的时候Xcode会自动创建一个桥接文件“yourProgectName-Bridging-Header.h”,如果没有创建或者删除 ...

  5. 开发 Swift 和 Objective-C 混编的 Framework

    来源:黄文臣 blog.csdn.net/hello_hwc/article/details/58320433 前言 为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C ...

  6. obeject-c 与 swift 混编

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...

  7. swift实现与OC的混编

    swift与OC的混编 现在写swift,很多的类库还不是很全,很多的第三方还是只有OC版的,这个时候swift想用,通常都是采用的swift和OC混编的方式.这里给大家演示一下混编是如何做的. sw ...

  8. 详解 swift2.2 和 OC 的混编

    前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...

  9. iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

    swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...

随机推荐

  1. hdoj 2178 猜数字

    猜数字 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. hdoj 1872 稳定排序

    稳定排序 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. [C语言 - 12] Union联合

    union Student {   int age;   char *name; } stu;   union只按照最长的数据成员分配控件,适用于有N个数据不会同时出现的情况,用以压缩空间.

  4. Web 应用的安全性

    Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户授权 ...

  5. Visual C#使用DirectX实现视频播放

    Visual C#使用DirectX实现视频播放 visual|视频播放 - 很多人第一次接触到DirectX大都是通过游戏,至于安装.升级DirectX的原因无非是满足游戏运行的需要.Direct ...

  6. jeewx的使用_01 接入和验证

    jeewx是java语言的用于开发微信公共平台的一个框架,有人说很臃肿,但个人感觉还不错,仁者见仁智者见智吧, 下面简单介绍工作原理: 1.下载 要使用jeewx需要先下载其源码 jeewx介绍:ht ...

  7. Why Does Everyone Else Appear to Be Succeeding?

    Why Does Everyone Else Appear to Be Succeeding?  —Steven G. Krantz When you are a student, it will a ...

  8. SAP PP 生产订单变更记录保存

    *&---------------------------------------------------------------------* *& 包括 ZXCO1U01 *&am ...

  9. Css基础-类选择器

    类选择器以一个.显示 <p class="pclass">这是第一个class</p> .pclass { color:red; } <div cla ...

  10. jboss 7部署cas3.4.11

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...