第四章——隐式可选类型

本文系阅读阅读原章节后总结概括得出。由于需要我进行一定的概括提炼,如有不当之处欢迎读者斧正。如果你对内容有任何疑问,欢迎共同交流讨论。

隐式可选类型也是可选类型,它们会在你使用到的时候自动解封。那为什么还要用隐式可选类型呢,主要有两个原因:

  1. 与OC混编

我们有可能在swift中调用OC的方法,返回一个指针。在写OC时,指针为空是一种很常见的情况,这样一来在Swift中我们可能得到一个引用或者是nil,所以返回值必须是可选类型的。由于很少有方法真的返回空指针,所以把返回值全部定义为可选类型有些得不偿失,而把它定义为隐式可选类型其实是一种权衡。

举个例子:

//OC定义了一个返回值为NSString *的方法
- (NSString *)giveName;
复制代码
//swift中调用这个方法
var name = p.giveName()
复制代码

这时候name的类型为String!,因为OC一侧没有明确表示返回的指针是否可能为空,swift认为它理论上可以是空指针,但实际上不太可能发生。如果改一下OC的的方法定义:

- (nullable NSString *)giveName;
复制代码

这样name的类型为String?。因为OC一侧已经很明确的表示了,这个返回的指针有可能为空。所以swift很自然地把它定义为String?类型。

  1. 只会短暂的为nil,但是在随后一段确定的时间内,一定不可能为nil

尽管隐式可选类型尽可能的隐藏了它可选类型的特性,让你在使用时感觉它和非可选类型非常相似,但它依然与非可选类型有一些微小的区别,比如你不能把它作为被标记成inout 的参数使用:

func increment(inout x: Int) {
++x
}

var i = 1
increment(&i) // i = 2

var j: Int! = 1
increment(&j) // 编译错误
// Cannot invoke 'increment' with an argument list of type 'inout Int!'
复制代码

隐式可选类型作为一种可选类型,它依然具有可选类型的特性。比如你可以使用可选链、空合运算符,if let隐式绑定以及map方法等:

var s: String! = "Hello"
s?.isEmpty  // 使用可选链,返回结果为可选类型的false
if let s = s { print(s) } // 隐式绑定,结果为打印"Hello"
s = nil
s ?? "Goodbye"  // 空合运算符,返回结果为"Goodbye"
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值