swift的可选值(optional)
苹果那文档写了一大堆也没有好好的写一下可选值(optional)这个东西。就是在有一个“Optional Chaining”的章节,但是也不是很充分的说明。最后找了半天在“the basics”里墨迹了几句。如果你没找到optional这个东西的话,那你可能也错过了一个很重要的东西,非optional类型的变量,这个变量的值不能是nil。这一点和ObjC以及其他的编程语言如C#、Java什么的差别很大。
var example : String = "hello world"
example = nil //ERROR, Type 'String' does not conform to protocol 'NilLiteralConvertible'
Optional的值就是可以为空也可以不为空的。定义的方式是这个样子的:
var example : String? = "hello world"
对,就是在类型后面的那个问号。有了这个问号,这个变量就是optional的了。它的值就可以为nil了。但是,你是不能直接访问这个变量。
书接上文,非optional的变量不可以赋值为nil的特点。让编程变的安全。因为,如果不检查是否为空就直接使用的话是编译不过的。如:
var example : String? = "hello world"
//example = nil
var example2 : String = example //ERROR, value of optional type 'String?' not unwrapped
错误的提示说的是optional类型的变量没有“拆包”。那么,如何拆包呢。很简单,只要在后面加上一个感叹号就可以了,如:
var example : String? = "hello world"
//example = nil
var example2 : String = example!
“!”感叹号unwrapp,拆包optional的变量。如果这个变量下有值的话就返回这个值,没有的话就会产生一个运行时的错误。
所以呢,苹果推荐了一种更安全的使用optional类型变量的方法。首先设定一个Employee类。它有一个成员属性为name。
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"。那么安全的方式是什么样呢:
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)的更多相关文章
- 2. Swift元组|可选值|断言
1. 元组英文名字 Tuple,将多个数据类型(任意类型)组合成一个数据,与c语言的中的机构体有几分相似,功能也是非常强大的,尤其是在定义请求参数,状态之类的地方经常用到. let http404Er ...
- Swift 可选值(Optional Values)介绍
Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...
- Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)
本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之 ...
- Swift语言指南(六)--可选值
原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值 注: 在 C 和 Objective ...
- Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言
1.Tuples(元组) 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名 let ...
- 窥探Swift之新添数据类型元组与可选值
今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...
- Swift编程语言学习1.6——可选值
可选值 使用可选(optionals)来处理值可能缺失的情况.可选表示: 有值,等于 x 或者没有值 注意: C 和 Objective-C 中并没有可选这个概念.最接近的是 Objective- ...
- swift可选值总结
1.枚举结构: 2.装包.解包概念:关联值. 3.可选值声明: 4.解包: 5.可选值作为参量生成的链. 6.可选值调用链. 最后做个总结 访问可选对象的属性或方法时,可以用 ? 号 访问可选对象的属 ...
- S(tuple)类及可选(Optional)类型型
元组将多个值组合为单个值.元组内的值可以是任意 类型,各元素不必是相同的类型.元组在作为函数返 回值时尤其有用. 1.定义方法1 let http404Error= (404,"Not Fo ...
随机推荐
- 用原生 JS 实现双向绑定及应用实例
写在前面: 所谓的双向绑定,无非是从界面的操作能实时反映到数据,数据的变更也能实时展现到界面.angular封装了双向绑定的方法,使双向绑定变得十分简单.但是在有些场景下(比如下面那个场景),不能使用 ...
- TongWEB与JOnAS 对比,国产中间件战斗机东方通TongWEB源码解析
转自网址: http://bbs.51cto.com/thread-489819-1-1.html 首先需要声明的是,本人出于技术爱好的角度,以下的文字只是对所看到的一些情况的罗列,偶尔附加个人的一些 ...
- redhat 连接mysql数据库Can't get hostname for your address
redhat 连接mysql数据库Can't get hostname for your address Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQ ...
- string类的简要实现
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #inc ...
- Python yield详解***
yield的英文单词意思是生产,有时候感到非常困惑,一直没弄明白yield的用法. 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(alist): f ...
- iis 在站点中新建虚拟目录站点之后,虚拟目录中的 web.config 与 主站点中的 web.config冲突解决方案
在虚拟目录站点中增加如下配置即可:<clear/>
- find 和 find_all 用法
soup = BeautifulSoup(requests.get(url).text, 'html.parser') soup.find('span', class_='item_hot_topic ...
- python数据库连接池基于DBUtils
DBUtils模块的使用的两种方式 DBUtils是Python的一个用于实现数据库连接池的模块 安装 pip install DBUtils 1.使用姿势一(不建议此方法) 为每个线程 (资源占用过 ...
- springcloud(六) Hystrix 熔断,限流
Hystrix 熔断: 首先仍然启动Eureka,这里就不说了. OrderController.java: package com.tuling.cloud.study.user.controlle ...
- 安装配置Android开发环境SDK
引言: 好搞事情,搞点移动端测试高大尚的东西,首先先得把环境搭建起来: 1.下载 握了个草,很多网站都直接推荐到android官网去下载,叔不知google官网早就被我大天朝给墙了,对于不喜欢FQ的天 ...