基本了解

在Swift代码会经常看到定义属性或方法参数时类型后面会紧跟一个感叹号( ! )或问号( ? ), 刚开始接触Swift的童鞋就可能不太明白之代表什么意思,一头雾水,开始凌乱了。

本文将带你了解感叹号( ! )与问号( ? )之谜,首先问号( ? )是可选类型,是用来处理值可能缺失的情况,也就是没有值的情况(也就是OC中NULL); 感叹号( ! )就是与之相反的, 就是一定有值(非可选类型),不存在空值的情况(OC中NULL)。

下面根据不同使用场景来进一步了解感叹号( ! )与问号( ? )之谜

各个场景中的叹号( ! )与问号( ? )

类的属性

class MyClass {

    var value: String!
var optionalValue: String? // defaulit is nil, 所有定义为可选类型的,可选值都是nil, 和数据类型没有关系。
}

MyClass定义了2个属性:valueoptionalValue,其中optionalValue为可选类型;这表示value在使用之前一定是赋了值的(一定有值),optionalValue则有可能值缺失。下面先来看看几个代码片段来深入了解感叹号( ! )与问号( ? )之谜

1. 下面代码,在运行时初始化一个MyClass实例会发生什么呢?

class MyClass {

    var value: String!
var optionalValue: String? init() { let _ = value.count
let _ = optionalValue?.count // 可选解析
}
}

程序会崩溃,报以下错误

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

value是非可选类型,必须要有值,从代码中看出value从赋值过。另外构造函数里的问号( ? )是指可选解析(弱解析),并不是指可选类型,这里要注意了

2. 下面代码,在运行时初始化一个MyClass实例会发生什么呢?

class MyClass {

    var value: String!
var optionalValue: String? init() { value = "this is string value." let _ = value.count
let _ = optionalValue!.count // 强解析
}
}

程序会崩溃,和代码片段1报一样的错误

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

大家肯定奇怪了明明value已经赋值了,为什么还会崩溃,问题出在optionalValue属性,不知道大家注意了没有,此代码的构造函数中optionalValue后面是感叹号( ! ),而代码片段1的构造函数中optionalValue后面是问号( ? )。这里的感叹号( ! )是指强解析,你也可以理解为强制取值,但是optionalValue至定义后从未赋值过,也就是没有值(特别注意:可选值不是值),自然也就和代码片段1报一样的错

未完待续 ,我的个人博客 [ 云博客BLOG ]最先更新

Swift中的感叹号( ! )与问号( ? )之谜的更多相关文章

  1. swift 中的问号跟感叹号

    ?: 变量在使用过程中可能存在空值,则需要用?标记,否则赋空值会报错 ? 1 2 var mustNoNilValue: String = "Swift" var canNilVa ...

  2. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

  3. swift中,Optional、?与!之间的关系

    swift中,Optional.?与!之间的关系 Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时 ...

  4. Swift中的Optional类型 (可选类型)与强制解包 ? !

    我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...

  5. 深圳尚学堂:Swift中的“!”和“?”

    Swift中的"!"和"?"Swift,苹果于2014年WWDC发布的新开发语言,用于搭建基于苹果平台的应用程序.Swift是一款易学易用的编程语言,而且它还是 ...

  6. swift中的?和!理解

    本文转载至 http://www.cnblogs.com/dugulong/p/3770367.html 首先贴cocoachina上某位大大的帖子:     Swift语言使用var定义变量,但和别 ...

  7. 浅谈 Swift 中的 Optionals

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  8. swift中的可选类型

    可选类型也是Swift语言新添加的对象.主要是为了解决对象变量或常量为空的情况.在前面定义的变量和常量都不能为空.里面必须要有值. Swift中的可选类型则允许变量(常量)中没有值(被设为nil).要 ...

  9. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

随机推荐

  1. Handler机制中的消息队列

    --> 学习自蘑菇街大佬 Handler机制可以看成是一个消息阻塞队列,当有消息时立即处理消息,没有消息时则阻塞.在Android系统中APP启动后很快进入死循环,不断读取MessageQueu ...

  2. The entity "nbsp" was referenced, but not declared

    翻译 实体""被引用,但没有声明 问题 使用xhtmlrenderer将网页转成PDF时报The entity "nbsp" was referenced, b ...

  3. hexo创建新文章的正确方法

    起因 之前我一直是通过复制以前的文章的形式来创建一个新的文档,但是这一次似乎遇到了一些问题.我将文章写完之后,准备进行预览,输入hexo s命令.在预览页面却没有显示出新的文章,还是和之前的页面是一样 ...

  4. ES介绍与实践

    一.ES介绍 1.基础概念介绍 1. 索引:Elasticsearch中的“索引”有点像关系数据库中的数据库. 它是存储/索引数据的地方: 2.分片 shard “分片”是Lucene的一个索引. 它 ...

  5. 淘宝网-接口测试白皮书V0.1

    <软件自动化测试开发> 出版了 淘宝(中国)软件有限公司 接口测试白皮书   V0.1 淘宝网平台测试组(qa.taobao.com) 淘宝网-接口测试白皮书 2 目录 1  接口测试的背 ...

  6. elasicsearch数据自动清理脚本

    elasticsearch随着保存的数据越来越多,磁盘占用越来越大,有必要进行定期自动清理. 直接上脚本 cat es-index-clear.sh #/bin/bash #查看索引信息 #curl ...

  7. PAT B1080 MOOC期终成绩(C++)

    PAT甲级目录 | PAT乙级目录 题目描述 B1080 MOOC期终成绩 解题思路 可利用 map 将字符串型的学号转换为整型的序号,方便查找.输入全部成绩后,遍历每个学生同时计算最终成绩,然后将成 ...

  8. Thinkpad E40热键不能使用解决办法

    Thinkpad E40 0578M68笔记本电脑安装windows7 64bit和联想官网驱动后,键盘最上面一排热键中,除了静音.减小音量和增大音量之外,其余的热键均不可用,解决办法: 到联想官网下 ...

  9. LeetCode~报数(简单)

    报数(简单) 题目描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1 11 21 1211 111221 1 被读作 "one 1" ( ...

  10. 使用python抓取汽车之家车型数据

    import requests import pymysql HOSTNAME = '127.0.0.1' USERNAME = 'root' PASSWORD = 'zyndev' DATABASE ...