swift 可选类型(optional)
可选类型定义
Swift 标准库中定义后缀 ?为可选类型 Optional<Wrapped> 的语法糖,这里语法糖可以简单理解为一种便捷的书写语法。也就是说,下面两个声明是等价的:
var name: Optional<String>
var name: String?
上述两种情况,变量 name 被声明为可选字符串类型。
我们可以在xcode编译器中,按住 command 键 同时点击 OPtional,可以跟进去查看可选类型的具体实现:
public enum Optional: ExpressibleByNilLiteral {
/// The absence of a value.
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none
/// The presence of a value, stored as `Wrapped`.
case some(Wrapped)
/// Creates an instance that stores the given value.
public init(_ some: Wrapped)
其他部分省略。。。。
}
我们看到,可选类型 Optional<Wrapped> 是一个枚举,有两个成员:none 和 some(Wrapped),表示可能没有值或者可能有值。
var name: String?
print(name)
//打印:nil
name = "haha"
print(name)
//打印:Optional("haha")
上述例子,name声明为可选类型,没有初始化的时候,自动置为nil。当你声明一个可选变量或常量但没有赋初值,它们都会被自动置为nil。
注意:Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型,但非可选的类型值不能置为nil。
if 语句以及强制解析
可以使用 if 语句 和 nil 比较来判断一个可选值是否有值:
if name != nil {
print(name!)
}
//打印:"haha"
当确定可选值有值的时候,可以在变量名后跟 !符号来强制解析该可选值,注意,不能用 !强制解析不包含值的可选值,否则导致运行出错。
可选绑定
使用可选绑定来判断一个可选值是否包含值,若包含值则赋给一个临时变量或常量。如下可选绑定用在 if 语句中:
if let nick = name {
print(nick)
}
//打印:"haha"
这段代码可以理解为:可选值 name 包含一个值“haha”,则创建一个临时的新常量 nick 并把可选值 name 的值赋给它。
还可以包含多个可选绑定或多个布尔条件在一个 if 语句中,只要使用逗号分开就行。只要有任意一个可选绑定的值为nil,或者任意一个布尔条件为false,则整个if条件判断为false。
隐式解析可选类型
有时候在程序中,第一次赋值后,可以确定一个可选类型总是有值,这样,在以后的调用中总是判断和解析可选值是效率低下的,这种类型的可选状态为被定义为隐式解析可选类型。把想要用作可选类型的 ?改为 !来声明一个隐式解析可选类型。隐式解析可选类型依然是一个可选类型,可选类型的特性它同样适用,只是注意,当隐式解析可选项值为 nil 的时候解析取值,会运行出错。如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型。
var hehe: String! = "hehe"
var s1: String = hehe //s1类型是 String
var s2 = hehe //s2类型是由 hehe 推断出为 可选类型 String?,所以下面打印格式不同
print(hehe,s1,s2)
//打印:hehe hehe Optional("hehe")
swift 可选类型(optional)的更多相关文章
- Swift可选类型(Optional)之星耀
首先我们先看下Objective-C与Swift语言对于可选nil的不同理解: Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体.枚举等类型不起作用(会返回N ...
- swift 可选类型笔记
晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...
- swift 可选类型(optional)--- swift 入门
一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...
- [swift]可选类型
可选类型 <Swift权威指南>第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍.尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Sw ...
- Swift 可选类型-备
我们先看看如下代码: var n1: Int = 10 n1 = nil //编译错误 let str: String = nil //编译错误 Int和String类型不能接受 ...
- Swift - 可选类型详解
可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...
- iOS:swift :可选类型
import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil ...
- Swift可选类型
可选类型 可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不 ...
- Swift 可选值(Optional Values)介绍
Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...
随机推荐
- Linux之例行(任务调度)
一. 例行命令之at 1.1 at 仅执行一次就从Linux任务中取消 1.2 at 指令可以将工作命令写入工作记录文件,工作记录文件默认存放在/var/spool/at目录内 1.3 at 工作 ...
- java做单用户的多重并发会话数限制
判定条件很简单,就是在同一时刻,同一帐号仅在一个终端上可正常操作. 我这里用简单的key,value进行判定,将用户存储在map里面,新登录用户登陆进系统后,判断map里是否存在当前用户,若存在就删除 ...
- css常用居中
对一个已知大小的元素上下左右居中(已知大小了,直接margin也就行了): css如下:.parent{height:100px;width:100px;background:grey;positio ...
- exports和module.exports的区别
总结:exports是module.exports的指向. 1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 ...
- ecshop点滴记录
会员中心: 用户中心页面的内容分布在两个模板文件中: user_clips.dwt(包含:欢迎页.我的留言.我的评论.我的标签.收藏商品.缺货登记.添加缺货登 记.我的推荐.单个商品推荐) user_ ...
- 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串 从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...
- 1.Java集合总结系列:Java集合概述
一.概述 集合是 Java 中非常重要的 API,在实际应用中非常广泛,在许多面试中也是必考的知识点. Java 所有集合类都位于 java.util 包下,Java 的集合只能保存对象,而无法保存保 ...
- poj 3070 Fibonacci (矩阵快速幂乘/模板)
题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring& ...
- Linux工具XFTP、Xshell(centos配置java环境 工具篇 总结一)
♣Xmanager5是什么? ♣安装XFTP ♣安装Xshell 1.Xmanager5(官网:https://www.netsarang.com/download/software.html)是全新 ...
- Spring Dubbo 开发笔记(一)——概述
概述: Spring Dubbo 是我自己写的一个基于spring-boot和dubbo,目的是使用Spring boot的风格来使用dubbo.(即可以了解Spring boot的启动过程又可以学习 ...