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

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/4018142.html,如需转载请自行联系原作者

swift的可选值(optional)相关推荐

  1. Swift之深入解析可选类型Optional的底层原理

    一.Optional 简介 Swift 的可选(Optional)类型,用于处理值缺失的情况,可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值". S ...

  2. swift_010(Swift 的可选类型)

    //***********swift--1.3--可选类型--*************************** // (Optionals)即在某个数据类型后面加上问号(?)或感叹号(!) // ...

  3. 十六、Swift 可选值链条 Optional Chaining

    1. 概述 当某个可选值可能为空时,如果要访问它的属性.方法.下标脚本,需要使用Optional chaining 对它进行解包,然后进行访问. 如果这个可选值包含一个值,那么访问成功. 如果这个可选 ...

  4. swift语言新特性:可选值

    var  a?  此处的a就是个可选值,意思是该值可能是缺失的. 可选 使用可选(optionals)来处理值可能缺失的情况.可选表示: -有值,等于 x 或者 没有值 注意:C 和 Objectiv ...

  5. 窥探Swift之新添数据类型元组与可选值

    今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...

  6. iOS开发笔记之九十四——Swift中的可选类型Optional

    一.Optional类型的概念 Swift中为何要引入Optional的概念,官方文档中有介绍: Swift also introduces optional types, which handle ...

  7. Swift3.0可选类型(Optional)倾心总结

    本篇主要对Swift3.0版本的可选类型经常使用的场景及注意点加以总结,当做以后可以随时翻译的资料:因为本篇为自己编码时候的总结,难免会有遗漏,希望广大读者加以补充 Swift3.0 Optional ...

  8. Swift 参数可选和必选的区别

    关于Swift 参数可选和必选的区别 很多小伙伴会遇到这样的问题 意思就是,你必须给我确定的类型String 不能为空, 'nil' cannot be assigned to type 'Strin ...

  9. C#函数式编程之可选值

    在我们的实际开发中已经会遇到可空类型,而在C#中自从2.0之后就提供了可空类型(Nullable<T>),普通的值类型是不可以赋值为NULL,但是在类型的后面加上问号就变成了可空类型,这样 ...

最新文章

  1. Leetcode 383 Ransom Note
  2. WCF关于svcutil生成关于TCP绑定出现 元数据包含无法解析的引用:“net.tcp://127.0.0.1:9999/xxxx/”的解决方案...
  3. 成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
  4. JAVA入门_多线程_邮局派发信件
  5. 【Processing学习】 - 公交车马路动态绘制
  6. 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
  7. 使用RMAN创建复制数据库
  8. freetextbox java_FreeTextBox-Java架构师必看
  9. hive的hql怎么运行_在Ubuntu上安装Apache Hive并运行HQL查询
  10. WPF 最简方法使用自己定制的 WPF 框架
  11. 对比解析开源云平台:Eucalyptus VS OpenStack
  12. iserdese2接口详解_-02-Xilinx的SerDes接口介绍【Xilinx-LVDS读写功能实现】
  13. win10蓝屏代码_如何让电脑蓝屏 让电脑蓝屏方法介绍【详解】
  14. namespace什么意思
  15. 计算机专业在房管局,计算机故障 昨天房产局无法办过户
  16. 精美素材:10套最新出炉的免费扁平图标下载
  17. Appium----基于Ubuntu系统安装个人版免费的Android模拟器Genymotion模拟器
  18. 小程序开发工具绑定服务器,微信小程序绑定到第三方平台流程
  19. 32位(x86)和64位(x64)
  20. IfThen/IIF/Case

热门文章

  1. JPEG文件格式简单分析
  2. 一种比较兼容的Excel报表导出方法
  3. Silverlight教程第四部分:使用 Style 元素更好地封装观感 (木野狐译)
  4. Corejava -异常
  5. [bzoj 1954]Pku3764 The xor-longest Path
  6. Java并发框架——AQS之怎样使用AQS构建同步器
  7. 开源jar包导入查看源码
  8. expect简单教程
  9. 增加/dev/shm大小
  10. 如何实现Asp与Asp.Net共享Session