苹果那文档写了一大堆也没有好好的写一下可选值(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>。

最新文章

  1. TFS工作区(Workspaces )命令
  2. ECMAScript 6(ES6)有什么新东西
  3. ubifs核心对象 -- TNC和LPT
  4. ios学习之UISwipeGestureRecognizer手势识别
  5. Mybatis Generator(定制化)代码生成器
  6. Web 仪表盘
  7. hive查询语句
  8. memcached完全剖析–1. memcached的基础
  9. C++ 利用socket实现TCP,UDP网络通讯
  10. 我只能说,CDH5真的屌爆了!!!
  11. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project child02
  12. js和JQuery区别
  13. Java8学习笔记(八)--方法引入的补充
  14. javascript学习笔记(六):对象、内置对象
  15. Toggle Checkboxes on/off
  16. 配置ftp服务器只能上传不能进行其他操作
  17. CentOS 删除桌面环境
  18. 「小程序JAVA实战」小程序模块之间引用(19)
  19. C++异常~二 转
  20. poi读取excel的辅助类

热门文章

  1. C# zedgraph 怎么设置初始时坐标轴的比例??
  2. redis Linux 、Windows ubuntu 下的安装
  3. 事务的ACID和四个隔离级别
  4. bzoj2865 字符串识别
  5. mac电脑 pip安装包后 撞到了系统python里面的解决方法
  6. postman 获取时间戳的方法 和md5加密的方法
  7. VCS双机原理
  8. OpenVPN添加本地路由方法
  9. CFGym 101194L 题解
  10. 好记性不如烂笔头--linux学习笔记8关于nginx的动静分离