可选类型与强制解包

Swift


前言

写在Swift4.0发布前夕.内容还是以swift3.1为主.不会讲述过于基础的部分.类似于字符串,数组,字典的使用.主要是自己也是从Objective-C转到Swift开发的.主要写一下,需要注意的一些地方.内容会更多关注使用方面的问题,具体的为什么这么使用,很多技术大牛都已经写过了...

? ! 可选类型与强制解包

每个从其他语言转过来学习Swift的人都会被 !? 所迷惑,这是什么东西?为什么会出现这东西.这是每一个Swift初学者都会困惑的地方.

因为Swift是个强类型安全语言,并且是编译检查,和Objective-C区别在此.一些错误,在编写代码阶段,编译器就会告知错误,因此开发者必须清楚的知道自己所使用的每一个值在当前上下文环境中是否有效!简单来说:谁使用,谁负责.

举个例子

在Objective-C中频繁使用的 关键字 nil 在Swift中就不是那么好使了

var a : String = "c"
a = nil
print(a)

定义一个字符串变量.当重新给 a 赋值的为 nil 时候,编译器会报错

error: nil cannot be assigned to type 'String'

并不能直接给一个变量赋值为 nil,这是在Objective-C 中并不存在的,因为在Objective-C中,任何指针都可以指向 nil

所以在实际开发中,如果你需要将 nil 赋值给一个变量或者类.需要将此变量或类变为可选值(Optional)

var a : String? = "c"
a = nil
print(a)

只需要在定义时候加上一个 ? 即可让其变为可选变量,而当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil.

当某一个函数的参数是可选类型的时候,调用此函数时,此参数可以直接传 nil

函数定义
func generationFromUrlString(qrString: String?, qrImage: UIImage?) -> UIImage? {}
函数调用
generationFromUrlString(qrString: nil, qrImage: nil)
强制解包

还是上面的例子,当变量a 为可选类型的时候,

var a : String? = "c"
a = "ee"
print(a)

打印变量的a值,控制台会输出

Optional("ee")

莫名其妙的会多出 Optional.如果是给UI控件赋值, Optional 也会显示到UI层上.这时候就需要 解包 了.因为我们只是要 ee 而不想要多余的Optional("").解包的话很简单,就是 ! . 其实不论是 ! 或者上文中的 ? 都不过是Swift的语法糖而已.当我们再次打印的时候

print(a!)

控制台就会输出我们想要的内容

ee

需要注意的就是,如果你使用 ! 进行强制解包.那么你就得负责,即你必须确认 变量 a 是非 nil 的.否则,就会出现问题

你可能感兴趣的:(可选类型与强制解包)