6.4 问号?和感叹号!的用法解析 [Swift原创教程]
1. 和别的语言不同,系统不会自动给变量设置初始值,也就是说变量不会有默认值。所以在使用变量之前需要进行初始化,否则就会出错。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE5LzllYjVhYWJhZDYxZTdiN2M5ZWYwYzM2ZDdhN2VhOTYzLnBuZw==)
2. 利用泛型定义一个Optional类型的变量,从右侧可以看出,它是空值,没有初始值。Optional其实是个枚举,里面有None和Some两种类型,用来包装原始值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk5LzNiNzhiZThiMWMzOTBhYjNhOTZmZjY4NjI5NGVlOTliLnBuZw==)
3. 定义一个可选类型的字符串变量,从右侧的结果可以看出,它的值也是空值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkxNS85MGY5Zjg1NzM5NWQ5NWEzNWZkYjY2NzEzMDRiMGQ3My5wbmc=)
4. 定义一个字符串类型的变量。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ1OC82M2NmYzM0NDQ3OTY1MTE3MDg1YmJmYTI4NmI4ZTk2YS5wbmc=)
5. 由于该变量的值为空,所以出现错误提示,需要对变量进行初始化操作。接着对这两行代码进行修改。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU1Mi9jMjY0NGIxZjBlMjYwMzZmNDRkN2E5MDA3ODFiY2NkMC5wbmc=)
6. 两行代码各增加了一个问号。前一个问号的作用是声明一个Optional变量,后一个问号的作用是,在对Optional值操作时,判断是否可以响应后面的操作。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMwNS8wNmViZjlkNjA3MzY0ZTFkMWIzYmMxMmI1NjkyNWRmMS5wbmc=)
7. 因为变量的值为空,所以无法执行第14行代码中的第一个问号后面的代码。此时双问号就发挥了作用,当前面的代码无法执行时,就采用双问号后面的值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI4My85Y2FlMGQyOWZlNGUzZjg4ODk4ZDZiNWM2ZGU3ZTFkMy5wbmc=)
8. 将第17行中的第一个问号,修改为感叹号,此时也出现了错误提示,这是因为感叹号会对左侧的Optional值进行拆包(从枚举里面取出来原始值)。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk2Ny9mNTNkYmZlNjZmMDY1ZjFkMTNiYzBjMjUxZjk1MTkzZi5wbmc=)
9. 继续定义一个可选变量。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1OS9mODIxZDcyN2MxOTBiYTU5ZTJlYjdmMmI5YWQ1ZDFmZi5wbmc=)
10. 这次我们给这个变量赋予一个初始值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ0L2JjMTc0ZjhkZjlhN2EzZmFiNmFjZDMyZDdhM2YwMmZjLnBuZw==)
11. 此时再使用感叹号,对被Optional包裹的变量进行拆包,现在已经可以在右侧正常显示它的值了,并且没有被Optional包裹。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMy9jNzlhODBlOTM4NTQ0YzE0MDllNDI1NjE0ZTAzMDgwZC5wbmc=)
12. 如果将感叹号更改为问号,也可以正常获取它的值,但是因为没有拆包的原因,所以它的值会被Optional包裹。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ4OC9iNjRiYjU0NDVkMDU4M2Q1OWYzYTZhYjVkOTA4YjE0MC5wbmc=)
13. 如果一定要使用问号,也可以给它补充一个默认值,点击此处的修复按钮,添加一个默认值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMwNS82OTMxMjkwNTcyYjk3MzNkZjU5OWJiNjMyY2M2YzkyMS5wbmc=)
14. 此时会出现一对问号,然后在问号的后方输入当变量的值为空时,选用该默认值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU5Mi9jOWZkNDgyZGRkNzJmNTQ1MTdhNTk3NTRkMTZiYjFiMC5wbmc=)
15. 此时右侧可以正常显示结果了。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkyOC84ZjE1ZDc5NzUzMWU1NzFmZGRjNTFiN2MwMDlhYTlmMC5wbmc=)
16. 传统的空值判断,通常要使用if语句,代码量比较大,而使用问号和感叹号,则可以很简洁的进行空值的判断。下面就是一个空值判断的示例。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIyMS8xYTU2Yjk1YWYzNGYzYjYyNWYzM2Y0MGQ2MmRhZDAwZC5wbmc=)
17. 此时已经定义了两个类,并给两个类都添加一个Optional属性。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc3Ny8zY2ZkY2ZjYTMzMDFmMmM0MjFkNzc0ZmM3NDlmMzFiOS5wbmc=)
18. 继续给第二个类添加一个宠物类Optional属性。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczMi8xY2ZjMDdlM2MzNTgyNDA4YWZjNGQxODM3YTEyZTdhNC5wbmc=)
19. 初始化第二个类的实例对象。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNS85Njk4YjAyY2E2ZGVhNTg0YTYxNDNkYTEzZThkZGI2Ny5wbmc=)
20. 打印该对象的宠物属性,因为该属性没有初始值,所以在本行代码的右侧实时反馈区,显示它的值为空。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM0OS8wNjk0ODVmNmRhNDcyOGIwYjI1OGMwOTk3ZGJjZmMyZC5wbmc=)
21. 如果需要访问宠物属性的名称属性,则在宠物属性之后添加一个问号,然后再访问名称属性,这样当宠物属性的值为空时,直接返回空值,不再尝试获取名称属性。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU2MC8xNjg2YWMxMjRjZWJmYmZmMWNiZjkyYzJlNzgzZmJmMC5wbmc=)
22. 这样使用一行代码,就完成了通常需要使用多行if语句进行空值判断的功能。接着对宠物属性进行初始化。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU4Ni8yYzdjZTk2NmNlNTYwMmNlMjkzZDIyNzE2NGYxNmFmMi5wbmc=)
23. 打印该对象的宠物属性,因为该属性已经拥有初始值,所以在本行代码的右侧实时反馈区,显示了它当前的值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU3Ni9iYWJkNTFmZjVmY2RmYjYwZmFjNTFiODY4MjYxYzAxMC5wbmc=)
24. 接着使用相同的方式,获取宠物的名称属性,因为名称属性没有初始值,所以右侧显示的结果为空。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk3NC83NTg0MDQ0ZjYxZjgyYmYzMTQwZjQ5ZGFhZjAyZWE1ZS5wbmc=)
25. 给宠物的名称属性设置一个值。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM3NS9hY2RjYTY5ZjMxMmJjZDM0ZTIyMjZiMzVkOTdjMWMwZi5wbmc=)
26. 最后再尝试获取宠物的名称属性时,右侧的实时反馈区已经能够正常显示名称属性的值了。
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM5Ny80M2I1NzIxYjY1YmFmNWI1YTE2ZjEwM2Y2ZGQxY2VmNS5wbmc=)
![6.4 问号?和感叹号!的用法解析 [Swift原创教程] 6.4 问号?和感叹号!的用法解析 [Swift原创教程]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY0Ny9hYTdhM2VjYTk3MjY2MDQ0MjZmNjQ2Y2ExZTg4YmVlNy5wbmc=)
本文整理自:《Swift4互动教程》,真正的[手把手]教学模式,用最快的速度上手iOS开发和Swift语言,苹果商店App Store免费下载:https://itunes.apple.com/cn/app/id1320746678,或扫描本页底部的二维码。课程配套素材下载地址:资料下载
2. 利用泛型定义一个Optional类型的变量,从右侧可以看出,它是空值,没有初始值。Optional其实是个枚举,里面有None和Some两种类型,用来包装原始值。
3. 定义一个可选类型的字符串变量,从右侧的结果可以看出,它的值也是空值。
4. 定义一个字符串类型的变量。
5. 由于该变量的值为空,所以出现错误提示,需要对变量进行初始化操作。接着对这两行代码进行修改。
6. 两行代码各增加了一个问号。前一个问号的作用是声明一个Optional变量,后一个问号的作用是,在对Optional值操作时,判断是否可以响应后面的操作。
7. 因为变量的值为空,所以无法执行第14行代码中的第一个问号后面的代码。此时双问号就发挥了作用,当前面的代码无法执行时,就采用双问号后面的值。
8. 将第17行中的第一个问号,修改为感叹号,此时也出现了错误提示,这是因为感叹号会对左侧的Optional值进行拆包(从枚举里面取出来原始值)。
9. 继续定义一个可选变量。
10. 这次我们给这个变量赋予一个初始值。
11. 此时再使用感叹号,对被Optional包裹的变量进行拆包,现在已经可以在右侧正常显示它的值了,并且没有被Optional包裹。
12. 如果将感叹号更改为问号,也可以正常获取它的值,但是因为没有拆包的原因,所以它的值会被Optional包裹。
13. 如果一定要使用问号,也可以给它补充一个默认值,点击此处的修复按钮,添加一个默认值。
14. 此时会出现一对问号,然后在问号的后方输入当变量的值为空时,选用该默认值。
15. 此时右侧可以正常显示结果了。
16. 传统的空值判断,通常要使用if语句,代码量比较大,而使用问号和感叹号,则可以很简洁的进行空值的判断。下面就是一个空值判断的示例。
17. 此时已经定义了两个类,并给两个类都添加一个Optional属性。
18. 继续给第二个类添加一个宠物类Optional属性。
19. 初始化第二个类的实例对象。
20. 打印该对象的宠物属性,因为该属性没有初始值,所以在本行代码的右侧实时反馈区,显示它的值为空。
21. 如果需要访问宠物属性的名称属性,则在宠物属性之后添加一个问号,然后再访问名称属性,这样当宠物属性的值为空时,直接返回空值,不再尝试获取名称属性。
22. 这样使用一行代码,就完成了通常需要使用多行if语句进行空值判断的功能。接着对宠物属性进行初始化。
23. 打印该对象的宠物属性,因为该属性已经拥有初始值,所以在本行代码的右侧实时反馈区,显示了它当前的值。
24. 接着使用相同的方式,获取宠物的名称属性,因为名称属性没有初始值,所以右侧显示的结果为空。
25. 给宠物的名称属性设置一个值。
26. 最后再尝试获取宠物的名称属性时,右侧的实时反馈区已经能够正常显示名称属性的值了。
本文整理自:《Swift4互动教程》,真正的[手把手]教学模式,用最快的速度上手iOS开发和Swift语言,苹果商店App Store免费下载:https://itunes.apple.com/cn/app/id1320746678,或扫描本页底部的二维码。课程配套素材下载地址:资料下载