swift的可选值(optional)
苹果那文档写了一大堆也没有好好的写一下可选值(optional)这个东西。就是在有一个“Optional Chaining”的章节,但是也不是很充分的说明。最后找了半天在“the basics”里墨迹了几句。如果你没找到optional这个东西的话,那你可能也错过了一个很重要的东西,非optional类型的变量,这个变量的值不能是nil。这一点和ObjC以及其他的编程语言如C#、Java什么的差别很大。
1
2
|
var example : String = "hello world"
example = nil / / ERROR, Type 'String' does not conform to protocol 'NilLiteralConvertible'
|
Optional的值就是可以为空也可以不为空的。定义的方式是这个样子的:
1
|
var example : String? = "hello world"
|
对,就是在类型后面的那个问号。有了这个问号,这个变量就是optional的了。它的值就可以为nil了。但是,你是不能直接访问这个变量。
书接上文,非optional的变量不可以赋值为nil的特点。让编程变的安全。因为,如果不检查是否为空就直接使用的话是编译不过的。如:
1
2
3
|
var example : String? = "hello world"
/ / example = nil
var example2 : String = example / / ERROR, value of optional type 'String?' not unwrapped
|
错误的提示说的是optional类型的变量没有“拆包”。那么,如何拆包呢。很简单,只要在后面加上一个感叹号就可以了,如:
1
2
3
|
var example : String? = "hello world"
/ / example = nil
var example2 : String = example!
|
“!”感叹号unwrapp,拆包optional的变量。如果这个变量下有值的话就返回这个值,没有的话就会产生一个运行时的错误。
所以呢,苹果推荐了一种更安全的使用optional类型变量的方法。首先设定一个Employee类。它有一个成员属性为name。
1
2
3
4
5
6
7
|
class Employee {
var name : String
init(name: String){
self .name = name
}
}
|
然后,初始化一个Employee实例,并设定它是optional的: var e : Employee? = Employee(name:"Tom")。这个时候如果直接访问name属性就会报错,e.name = "Tom Cat" // ERROR。如上所说需要拆包。e!.name = "Tom Cat"。那么安全的方式是什么样呢:
1
2
3
4
5
6
7
8
|
var e : Employee? = Employee( "Tom" )
if let en = e?.name {
println( "employee's name is \(en)" )
}
else {
println( "unable to identify the employee" )
}
|
直接用感叹号的方法访问可能会运行时错误,如:let en = e!.name。
延伸阅读:“?”问号和“!”感叹号。都是Optional<T>的简写。更多请了解swift的泛型和Optional<T>。
swift的可选值(optional)相关推荐
- Swift之深入解析可选类型Optional的底层原理
一.Optional 简介 Swift 的可选(Optional)类型,用于处理值缺失的情况,可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值". S ...
- swift_010(Swift 的可选类型)
//***********swift--1.3--可选类型--*************************** // (Optionals)即在某个数据类型后面加上问号(?)或感叹号(!) // ...
- 十六、Swift 可选值链条 Optional Chaining
1. 概述 当某个可选值可能为空时,如果要访问它的属性.方法.下标脚本,需要使用Optional chaining 对它进行解包,然后进行访问. 如果这个可选值包含一个值,那么访问成功. 如果这个可选 ...
- swift语言新特性:可选值
var a? 此处的a就是个可选值,意思是该值可能是缺失的. 可选 使用可选(optionals)来处理值可能缺失的情况.可选表示: -有值,等于 x 或者 没有值 注意:C 和 Objectiv ...
- 窥探Swift之新添数据类型元组与可选值
今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...
- iOS开发笔记之九十四——Swift中的可选类型Optional
一.Optional类型的概念 Swift中为何要引入Optional的概念,官方文档中有介绍: Swift also introduces optional types, which handle ...
- Swift3.0可选类型(Optional)倾心总结
本篇主要对Swift3.0版本的可选类型经常使用的场景及注意点加以总结,当做以后可以随时翻译的资料:因为本篇为自己编码时候的总结,难免会有遗漏,希望广大读者加以补充 Swift3.0 Optional ...
- Swift 参数可选和必选的区别
关于Swift 参数可选和必选的区别 很多小伙伴会遇到这样的问题 意思就是,你必须给我确定的类型String 不能为空, 'nil' cannot be assigned to type 'Strin ...
- C#函数式编程之可选值
在我们的实际开发中已经会遇到可空类型,而在C#中自从2.0之后就提供了可空类型(Nullable<T>),普通的值类型是不可以赋值为NULL,但是在类型的后面加上问号就变成了可空类型,这样 ...
最新文章
- Leetcode 383 Ransom Note
- WCF关于svcutil生成关于TCP绑定出现 元数据包含无法解析的引用:“net.tcp://127.0.0.1:9999/xxxx/”的解决方案...
- 成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
- JAVA入门_多线程_邮局派发信件
- 【Processing学习】 - 公交车马路动态绘制
- 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
- 使用RMAN创建复制数据库
- freetextbox java_FreeTextBox-Java架构师必看
- hive的hql怎么运行_在Ubuntu上安装Apache Hive并运行HQL查询
- WPF 最简方法使用自己定制的 WPF 框架
- 对比解析开源云平台:Eucalyptus VS OpenStack
- iserdese2接口详解_-02-Xilinx的SerDes接口介绍【Xilinx-LVDS读写功能实现】
- win10蓝屏代码_如何让电脑蓝屏 让电脑蓝屏方法介绍【详解】
- namespace什么意思
- 计算机专业在房管局,计算机故障 昨天房产局无法办过户
- 精美素材:10套最新出炉的免费扁平图标下载
- Appium----基于Ubuntu系统安装个人版免费的Android模拟器Genymotion模拟器
- 小程序开发工具绑定服务器,微信小程序绑定到第三方平台流程
- 32位(x86)和64位(x64)
- IfThen/IIF/Case