Swift中的“!”和“?”
Swift,苹果于2014年WWDC发布的新开发语言,用于搭建基于苹果平台的应用程序。Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。 大家在使用swift时,应该都有过分不清“!”和“?”这两个符号的经历,今天就给大家具体的分析一下这两个符号的区别。
“!”和“?”是什么
“!”和“?”其实分别是Swift语言中对一种可选类型(Optional) 操作的语法糖。 那可选类型是干什么的呢? Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型生命后加加一个 ? 操作符完成的。

例如: var name: String?

Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None , 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因。

这里是enum Optional的定义
enum Optional<T> : LogicValue, Reflectable {

  case None
  case Some(T)
  init()
  init(_ some: T)
 
  /// Allow use in a Boolean context.
  func getLogicValue() -> Bool
 
  /// Haskell's fmap, which was mis-named
  func map<U>(f: (T) -> U) -> U?
  func getMirror() -> Mirror
}
既然这样, 那对于 var name: String? 该怎样去理解这句语法呢?
var name: String?
//  上面这个Optional的声明,是”我声明了一个Optional类型值,它可能包含一个String值,也可能什么都不包含”,也就是说实际上我们声明的是Optional类型,而不是声明了一个String类型 。
“!”和“?”的使用
一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:
if name {
    // 有值再操作
}
怎么使用Optional值呢?文档中也有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,如果是nil值,也就是Optional.None,会跳过后面的操作不执行,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执后面的操作,来保证执行这个操作的安全性。
“?”的使用场景:
1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作
3.使用 as“?”向下转型(Downcast)
上面提到Optional值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢?
拆包有两种方法:
可选绑定(Optional Binding)
可选绑定(Optional Binding)是一种更简单更推荐的方法来解包一个可选类型。 使用可选绑定来检查可选类型的变量有值还是没值。如果有值, 解包它并且将值传递给一个常量或者变量。
硬解包
硬解包即直接在可选类型后面加一个感叹号(!)来表示它肯定有值。
PS:对于“!”操作符,这里的变量值一定是非nil的!
其实, 还有一种叫隐式拆包(Implicitly Unwrapped Optionals),比如对于会在viewDidLoad进行初始化的变量,可以直接定义为var str :String!
等于说你每次对这种类型的值操作时,都会自动在操作前补上一个!进行拆包,然后在执行后面的操作,当然如果该值是nil,会报错crash掉。
PS:如果你在隐式解析可选类型没有值的时候进行取值,会crash。和在没有值的可选类型里面拆包是一样的。
“!”的使用场景
1.强制对Optional值进行拆包(unwrap)
2.声明隐式拆包变量,一般用于类中的属性
以上就是关于Swift中的“!”和“?”两个符号的具体区别与用法,希望会对你有所帮助。

深圳尚学堂:Swift中的“!”和“?”的更多相关文章

  1. 深圳尚学堂:Java中Class对象

    Java中生成Class对象和生成instance都有多种方式.所以只有弄清其中的原理,才可以深入理解.首先要生成Class对象,然后再生成Instance.那Class对象的生成方式有哪些呢,以及其 ...

  2. 深圳尚学堂:JavaScript中常见的字符串操作

    快到春节放假了,春节后又是一大波的找工作热潮,在前端实招聘笔试时,必不可免额会考到关于JavaScript中字符串的处理问题.考的不是你会不会,而是你能不能在不借用XX手册或者XX指南再或者百度谷歌的 ...

  3. 深圳尚学堂:Android APP的测试流程

    每一个新开发的软件都避免不了测试,我在这里总结了一些Android系统的移动端APP测试的一些测试流程,希望可以给大家一些帮助. 1. UI 测试App主要核ui与实际设计的效果图是否一致:交互方面的 ...

  4. 深圳尚学堂:Web程序员应该会的知识

    互联网的行业里涌入了很多的程序员, 都在为互联网的发展添砖加瓦.程序员可以分为很多种,像Unix程序员.Windows程序员,或是C++程序员.Delphi程序员,等等.今天我们谈谈Web程序员,一名 ...

  5. 深圳尚学堂:JavaScript的常见面试题

    经常说编程是一门技术专业,在找工作时面试官肯定不止看你的面试能力,还要看你的专业知识掌握,他可能会让你做一个小的编程测试,或者说考察你的语法知识掌握,今天,总结了一些关于在JavaScript中常常会 ...

  6. 尚学堂 216 java中的字节码操作

    所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...

  7. 尚学堂 215 在java中执行JavaScript代码

    package com.bjsxt.test; import java.io.FileReader; import java.net.URL; import java.util.List; impor ...

  8. 尚学堂 217 java中的字节码操作2

    package com.bjsxt.test; @Author(name="gaoqi", year=2014) public class Emp { private int em ...

  9. [JAVA教程] 2016年最新spring4框架搭建视频教程 【尚学堂】

    Spring4框架 主讲:邹波 类型:SSH 适合对象:学习完javase.数据库技术.jdbc者 Spring4.0作为一个广泛使用的开源框架,它由Rod Johnson创建.它是为了解决企业应用开 ...

随机推荐

  1. hibernate---关联关系的 crud_cascade_fetch

    CRUD怎么写?? 存user信息, 自动存group信息 user.java package com.bjsxt.hibernate; import javax.persistence.Cascad ...

  2. php中var_dump() 打印出一个对象的时候,信息怎么看?

    php 的一个依赖注入容器, 说白了,就是用php 的反射类,来在运行的时候动态的分析类具有的函数,以及动态分析函数的参数, 从而实例化类,并执行类的方法. 另外,php 中的 typehint 还是 ...

  3. [转载]七天学会NodeJS

    链接:http://nqdeng.github.io/7-days-nodejs/ NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS ...

  4. log4CXX第二篇---配置文件(properties文件)详解

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  5. jqGrid简述

    转自:http://www.blogjava.net/ilovebabyfat/archive/2012/04/06/373456.html jqGrid学习之 ------------- 安装 1. ...

  6. lpc1768的rit使用

    LPC1768在系统滴答定时器和通用定时器之外还引入了一个定时器,叫做重复定时器RIT,该定时器只能用于定时操作,带有一个中断,我个人的感觉,这似乎是为了延时函数设计的一个定时器 那么使用该定时器时遵 ...

  7. HDU 3903 Trigonometric Function

    这题真难,并不会推理... #include<cstdio> #include<cstring> #include<cmath> #include<algor ...

  8. 远程开户系统开放API接口

    如今随着智能识别技术的成熟和商用,金融领域也开始逐渐试水"远程开户".从OCR身份证识别到人脸识别,到如今市场上即将出现完整的远程开户系统,除了需要成熟的技术做支撑外,还需要对市场 ...

  9. UVa 10911 - Forming Quiz Teams

    题目大意:给出2*n个点,将这些点配成n对,使得所有点对中两点的距离之和尽量小. 用一个整数的二进制形式表示一个集合的子集,以每个集合为状态进行状态转移.具体参见<算法竞赛入门经典>9.5 ...

  10. 使用MyEclipse开发第一个Web程序

    MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导 ...