Swift中的感叹号( ! )与问号( ? )之谜
基本了解
在Swift代码会经常看到定义属性或方法参数时类型后面会紧跟一个感叹号( ! )或问号( ? ), 刚开始接触Swift的童鞋就可能不太明白之代表什么意思,一头雾水,开始凌乱了。
本文将带你了解感叹号( ! )与问号( ? )之谜,首先问号( ? )是可选类型,是用来处理值可能缺失的情况,也就是没有值的情况(也就是OC中NULL); 感叹号( ! )就是与之相反的, 就是一定有值(非可选类型),不存在空值的情况(OC中NULL)。
下面根据不同使用场景来进一步了解感叹号( ! )与问号( ? )之谜
各个场景中的叹号( ! )与问号( ? )
类的属性
class MyClass {
var value: String!
var optionalValue: String? // defaulit is nil, 所有定义为可选类型的,可选值都是nil, 和数据类型没有关系。
}
在
MyClass定义了2个属性:value和optionalValue,其中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中的感叹号( ! )与问号( ? )之谜的更多相关文章
- swift 中的问号跟感叹号
?: 变量在使用过程中可能存在空值,则需要用?标记,否则赋空值会报错 ? 1 2 var mustNoNilValue: String = "Swift" var canNilVa ...
- [翻译]理解Swift中的Optional
原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...
- swift中,Optional、?与!之间的关系
swift中,Optional.?与!之间的关系 Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时 ...
- Swift中的Optional类型 (可选类型)与强制解包 ? !
我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...
- 深圳尚学堂:Swift中的“!”和“?”
Swift中的"!"和"?"Swift,苹果于2014年WWDC发布的新开发语言,用于搭建基于苹果平台的应用程序.Swift是一款易学易用的编程语言,而且它还是 ...
- swift中的?和!理解
本文转载至 http://www.cnblogs.com/dugulong/p/3770367.html 首先贴cocoachina上某位大大的帖子: Swift语言使用var定义变量,但和别 ...
- 浅谈 Swift 中的 Optionals
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- swift中的可选类型
可选类型也是Swift语言新添加的对象.主要是为了解决对象变量或常量为空的情况.在前面定义的变量和常量都不能为空.里面必须要有值. Swift中的可选类型则允许变量(常量)中没有值(被设为nil).要 ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
随机推荐
- unittest(12)- 学习读取配置文件
1.配置文件格式 2.读取配置文件 import configparser """ 通过读取配置文件,来执行相应的测试用例 配置文件分为2个部分 第一部分:[SECTIO ...
- 刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)
刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码) 测试开发社区 6天前 文章转载自公众号 AirPython , 作者 星安果 阅读文本大概需要 12 分钟. 1 目 标 场 景 ...
- Mac上各种实用命令
下载Github资源:git clone 显示隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏隐藏文件:defa ...
- springboot+jwt实现token登陆权限认证
一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程:对小项目而已是个 ...
- 查看网卡信息 - ethtool
查看网卡是千兆还是万兆网卡,使用ethtool 网络接口名 ethtool eth0
- USB小白学习之路(12) Cy7c68013A固件之Slave FIFO(转)
Cy7c68013固件之Slave FIFO 转自:http://blog.csdn.net/zengshaoqing/article/details/53053539 选择SlaveFIFO传输方式 ...
- Nginx使用和配置
概要: Nginx 简介 Nginx 架构说明 Nginx 基础配置与使用 Nginx 反向代理与负载均衡 Nginx 实现高速缓存 Nginx 性能参数调优 一.Nginx 简介与安装 Nginx ...
- 一起了解 .Net Foundation 项目 No.9
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. DLR/IronPytho ...
- Node REPL环境
1.概述 REPL全称Read,Eval,Print,Loop,简单理解为接收用户输入,执行用户输入,打印执行结果并输出到控制台,进行下一次轮回,可以进行一些简单的测试,类似于浏览器的控制台. 命令行 ...
- js案例之使用正则表达式进行验证数据正确性
#js案例之使用正则表达式进行验证数据正确性 代码上传至 "GitHub" 样例: <tr> <td>密码:</td> <td> & ...