Swift入门(四)——可选类型(Optionals)与断言(Assert)
可选类型是什么?
首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,能够把String类型变量转换为Int类型变量。
var stringValue = "5"
var intValue = stringValue.toInt();
println("intvalue = \(intValue)")执行以上方法后得到了奇怪的结果:
intvalue = Optional(5)事实上,能够发现,toInt方法的返回值并非Int,而是Int?这是由于Swift提供了一种叫做“可选类型”(Optionals)的新类型。String和Int类型相应的可选类型各自是String?和Int?
由于并非每一个字符串都能够转换为整数,也就是说在执行
var intValue = stringValue.toInt();这句代码的时候。并不知道intValue的详细值。假设stringValue无法转换为Int类型,那么这里的intValue的值为nil。
和OC不同的是,nil并非一个空指针,也不仅仅限于对象类型,而表示随意一个可选类型的变量的值缺失。
String?和Int?等可选类型的变量值均能够为nil。比方执行下面代码:
var stringValue = "53d"
var intValue = stringValue.toInt();
println("intvalue = \(intValue)")得到的结果会是:
intvalue = nil可选类型与隐式可选类型
强制解封可选类型
假设想要使用转换后的变量值。而不出现Optional(xxx)这样奇怪的表示的话,能够使用感叹号(!
)运算符。强制使用可选类型变量里面的值。这在Swift里面叫做强制解封(Forced unwrapping of the optional’s value)。
然而强制解封一个值为nil 的可选类型会导致执行时错误(runtime error)。因此,在使用感叹号(!
)运算符强制解封可选类型变量时。一定要确保可选类型变量的值不为nil。
下面的代码详细解释了之前的概念:
var stringValue1 = "55"
var stringValue2 = "5d"
var intValueNotNil = stringValue1.toInt();
var intValueNil = stringValue2.toInt();
println("intvalue1 = \(intValueNotNil!
)") //强制解封。正常执行
println("intvalue2 = \(intValueNil!)") //强制解封,执行时错误。
须要再次提醒的是,执行时错误无法被编译器发现。会导致app直接闪退。所以正确的强制解封方案应该例如以下:
let unknownValue:Int? = 3
//let unknownValue:Int?
= nil
if unknownValue != nil{
    println("value = \(unknownValue。)")
}
else{
    println("value = \(unknownValue)") //不强制解封,直接打印nil
}另一点须要注意的是。可选类型在定义的时候必须赋初值。不能够用类型标注的方式跳过赋初值。否则会产生编译错误。
可选绑定
Swift是一门简洁的语言,使用强制类型解封来获取可选类型变量里的值过于麻烦,是非常多人不愿意使用的。因此,能够通过可选绑定的方式来解封可选类型中的值。
let unknownValue:Int? = 3
//let unknownValue:Int? = nil
if var variable = unknownValue {
    println("variable = \(variable)")
}可选绑定的关键在于if推断里的赋值语句。假设unknownValue的值为nil,if推断不成立。假设unknownValue的值不为nil,那么variable将会得到unknownValue解封后的值。因此在打印variable的时候不再须要使用感叹号(!
)运算符。
隐式解封可选类型
隐式解封可选类型简称隐式可选类型,是与可选类型相对的概念。它须要在原基础类型后加上感叹号。比方下面代码能够定义一个隐式可选类型:
var implicitOptional:Int! = 3隐式可选类型表示默认这个变量中一直有值(即不为nil)。使用隐式可选类型就赋予了Swift自己主动解封隐式可选类型的权利。不须要调用感叹号(!
)运算符就可以解封隐式可选类型。
var implicitOptional:Int! = 3
if implicitOptional != nil{
    println("implicitOptional = \(implicitOptional)")
}输出结果:
implicitOptional = 3须要注意的是,隐式可选类型事实上也是一种可选类型。也就是说,假设隐式可选类型的值为nil,依旧会触发执行时错误(Runtime Error)。所以在使用隐式可选类型变量时,为了安全起见。还是应该用if语句进行推断。
除了在后文介绍无主引用时提到的隐式可选类型的使用场景外,不建议使用隐式可选类型。直接用可选类型取代就可以
隐式可选绑定
隐式可选类型的可选绑定被称为隐式可选绑定,和可选类型的可选绑定在使用上全然一致。
只是没有必要细致研究了。演示样例代码例如以下:
var implicitOptional:Int! = nil
//var implicitOptional:Int! = 3
if var unknownImplicitOptional = implicitOptional{
    println("implicitOptional = \(unknownImplicitOptional)")
}断言
断言事实上与可选类型毫无干系,它的使用能够帮助程序猿比較easy的发现和定位错误。使用上也并不难,因此就放在第四章最后一并介绍了。
在Swift中。通过assert函数实现断言,当中第一个參数为推断条件,第二个參数为条件不满足时的信息打印。
let age = 20
assert(age > 20, "你是成年人啦!")假设断言被触发。将会强制结束程序,并输出相关信息:
assertion failed: 你是成年人啦!: file /Users/KT/Desktop/MyIOS/Swift练习/Swift——可选类型/Swift——可选类型/main.swift, line 45
(lldb) 使用断言非常easy。可是合理的加入断言,有助于定位和排除bug,是在使用Swift中的一个好习惯。
附录
查看完整专栏——《Swift轻松入门》
【Swift入门(一)——基本的语法】 
【Swift入门(二)——字符与字符串】 
【Swift入门(三)——元组(Tuple)】 
【Swift入门(四)——可选类型(Optionals)与断言(Assert)】 
【Swift入门(五)——数组(Array)】 
【Swift入门(六)——字典(Dictionary)】 
【Swift入门(七)——结构体(Struct)】 
【Swift入门(八)——功能强大的求余运算符】 
【Swift入门(九)——String与Int、Double、Float等数字相互转换】 
【Swift入门(十)——循环引用、弱引用和无主引用】 
【Swift入门(十一)——类型转换与is、as操作】 
【Swift入门(十二)——利用Extension加入逆序输出字符串方法】
Swift入门(四)——可选类型(Optionals)与断言(Assert)的更多相关文章
- Swift入门篇-基本类型(2)
		现在我也在学习Swift语言,常常去逛很多苹果社区和论坛,看到了圈子很多奇怪的现象,发现很多人都赶忙去翻译 Swift书籍 和 发布Swift的视频 .他们这种对新知识的探索精神我本人是很佩服的.但是 ... 
- swift中的可选类型
		可选类型也是Swift语言新添加的对象.主要是为了解决对象变量或常量为空的情况.在前面定义的变量和常量都不能为空.里面必须要有值. Swift中的可选类型则允许变量(常量)中没有值(被设为nil).要 ... 
- Swift入门篇-基本类型(3)
		一:元组 格式 变量或常量关键字 元组变量 = ( 变量,变量, …) 说明: : 元组变量还是一个变量,只不过表现方式和其他变量不一样 :()括号里面可以放入N个变量组成 例子: import Fo ... 
- Swift入门篇-基本类型(1)
		博主语文一直都不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 今天遇到了一个很烦的事情是,早上10点钟打开电脑,一直都进入系统(我的系统 mac OS X Yosemite 10.1 ... 
- Swift(二,元组,可选类型,类型转化)
		一,首先,元组是Swift中特有的,OC中没有元组相关类型,具体怎么用,看下面的例子吧 //1.使用元组来定义一组数据 let infoTuple = (,1.8) let nameTuple = i ... 
- Swift---- 可选值类型(Optionals) 、 断言(Assertion) 、 集合 、 函数
		1 使用数组实现九宫格 1.1 问题 Swift提供经典的数组和字典两种集合类型来存储集合数据.本案例使用数组实现一个九宫格程序,如图-1所示: 图-1 1.2 方案 九宫格就是有一个n行n列的方格, ... 
- springboot 入门四-时间类型处理
		springboot 自带了jackson来处理时间,但不支持jdk8 LocalDate.LocalDateTime的转换. 对于Calendar.Date二种日期,转换方式有二种: 一.统一app ... 
- Swift中的Optional类型 (可选类型)与强制解包  ? !
		我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ... 
- iOS:swift :可选类型
		import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil ... 
- [swift]可选类型
		可选类型 <Swift权威指南>第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍.尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Sw ... 
随机推荐
- h5-8 canvas
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- CodeForces 651A(水题)
			Friends are going to play console. They have two joysticks and only one charger for them. Initially ... 
- Dvwa安装,配置(Linux)
			文章演示使用系统:CenTOS7 一:搭建LAMP环境 使用XAMPP安装部署,下载地址:https://www.apachefriends.org/download.html 1.1:赋予账号对XA ... 
- 爬虫之 Requests库的基本使用
			引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃文档 ... 
- vue开发的项目中遇到的警告,报错,配置项目文件等合集(长期更新)
			1. Vue组件里面data()里面没有return时触发错误:Vue components Cannot read property '__ob__' of undefined 这个警告不解决会触发 ... 
- MSSQL_20160719_在作业步骤中使用sp_send_dbmail遇到的问题
			需求: 在作业步骤中使用sp_send_dbmail发出邮件, 并将数据库中的日志表通过@query参数导出文本作为邮件附件 遇到错误: 服务器 DB-DWH-1,第 1 行 服务器主体 " ... 
- 脚本编写 nginx 启动
			#!bin/bash#功能:本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本.#如果本脚本命名为/etc/init.d/nginx,则 service ... 
- day09网络编程
			一 操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ... 
- Steamroller   FreeCodeCamp
			function steamroller(arr) { // I'm a steamroller, baby var resultArr = []; for(var i = 0; i < arr ... 
- matlab学习创建变量定义函数
			定义变量a,b,c,计算输出d >> a=-3;b=2;c=5;>> d=(a^2+b)/c;>> d=(a^2+b)/c d = 2.2000 系统默认变量 a ... 
