创建: 2018/02/25

完成: 2018/02/26

更新: 补充类内可选型属性不初始化自动设为nil

【任务表】TODO

 可选型
 可选型与nil

可选型声明方法

var 属性: 类型? // 类型后面加问号
var 属性: Optional<类型> // 声明方法2: 带参数的类型指定
// 例
var sample: Int?
var sample2: Optional<Int>

不初始化则自动设为nil

   在类内不初始化自动设为nil

● 表达可能不存在/失败等情况,如函数执行失败返回可选型, 没有设定值等

● 可以减少接入空指针(误把nil当成正常值来用)

● 可以实现初始化可能失败的构造函数

 展开可选型

从可选性中去除正常值(有的话), 叫做unwrap, 展开

强制展开, !:

var sample: Int? = Int("abc")// 在实例后面加上!
var b = sample! // 错误,强制展开nil会报错

● !, ?不是运算符,不能重载

 条件判断与可选型

强制展开时遇到nil会报错,所以先判断是不是nil

if sample != nil {
var b = sample
}

● 可选型插值/作为字符串时,会警告。 去除警告用构造函数

String(describing: Subject)

  除了debug外不把可选型直接做字符串

   
 可选绑定相关语法

目的

使用可选值

如果可选值只是判定条件而不需要使用,直接用 != nil 来实现

if-let

(可选绑定

optional binding)

if let 属性名 = 可选型属性 { // 也可以用var
... //可选型属性有值时的处理
} else {
... // 可选型属性为nil时的处理
}

● 可选型属性有值是条件为真,代入属性里

● 可用var, 多个可选型时用逗号,隔开

if let 属性名1 = 可选型属性1, let 属性名2 = 可选型属性2, ... { // 也可以用var
... //可选型属性有值时的处理
} else {
... // 可选型属性为nil时的处理
}

● 属性名可与可选型属性名相同

也可以用在while里

 可选绑定与条件式  if-let里除了多个可选绑定外,还可以写普通条件(也是用逗号隔开)

if a!= 111, let a = a, a > , a <  {
...
} else {
...
}

● 左侧的可选绑定(展开的值)可以在右侧使用,如上例

● 也可以用在while, guard里

● 相当于&&, 没有相当于||的

● Swift的条件只能是布尔值,所以不能用&&和||。想用的话条件写成 != nil 类型的

 guard 

不仅限可选绑定, 脱离预想之外的处理时的用法

guard 条件 else {
...
return // 必须有break/return/throw等脱离guard所在范围的代码
}

● 条件可以是可选绑定也可以是其他任何条件

● 条件里的可选绑定在guard后面也可以继续使用

● 复杂条件下if-let的if层次会很多, 适当考虑使用guard

 nil聚合运算符

有值取值, 没值设定默认值

可选型属性 ?? nil下设定的值
// 例
Int("hello") ?? // 相当于 (Int("hello") != nil) ? Int("hello")! : 0

● 左侧类型T时,右侧可以使T, T?

● 运算结果的类型是右边的类型

● 可以连用, 短路评估

let sample = a ?? b ?? c ??  // a非nil就a,否则b, b非nil就b, 否则...
 可选型与函数   函数的参数类型, 返回值类型可以是可选型
 作为函数的inout参数 

inout参数的类型也可以是可选型

 readline函数 

readline(strippinggNewline: Bool = true) -> String?

 ● Swift的输入函数  (Swift的输出函数: print)

● 从标准输入读取比特列

● 字码UTF-8

● 读一行

● 返回值类型String?, EOF时返回nil

● strippinggNewline表示是否删除换行, 默认true

   
 有值可选型
 有值可选型
var 变量名: 类型!
//例
var sample: Int! = nil

● 不用展开,像普通属性一样用。其他方面和?可选型一样

应只用在只有初始值可以为nil的变量

● 只是评价值的时候进行特殊处理, 本身并不是真正的可选型

● 典型例: ViewController的属性(GUI等)

 元素为可选型的数组 

● 数组的元素可以为可选型

● 元素不能为有值可选型, 其他collection也是一样

 有值可选型与函数 

函数的参数类型,返回值类型可以是有值可选型

● 主要用于C, Objc的API返回的有值可选型(其实是指针) # TODO: Supply [S14.1 数据交互与指针]

    
 可能错误的构造函数
  可失败的构造函数

init? { // 带?
if ... {
return nil //错误时候必须返回nil
}
}

● 可失败构造函数和普通构造函数参数不能完全一样(因为返回值是决定好的, 算不上重载)

● init!也存在,主要是Objective-C的API用

   

最新文章

  1. Python 爬虫2——环境配置
  2. Java基础--Java语言介绍
  3. docker底层技术概览
  4. C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步
  5. c#面试题及答案
  6. Joomla插件汉化小程序
  7. DNA repair - HDU 2457(自动机+dp)
  8. .NET注册页面代码
  9. edmx文件
  10. Google App Engine 学习和实践
  11. ap143 添加复位和重启按钮
  12. CRC与MD5的异同
  13. MyBatis学习(六)MyBatis关联映射之一对多映射
  14. 状压DP小结
  15. ArrayList中对象 排序
  16. USB_ModeSwitch for Android 7
  17. HDU 6373(斜面上小球弹跳 运动分解)
  18. mongodb副本集用户权限设置
  19. consensus sequence
  20. CSGL

热门文章

  1. 《effective C++》:条款07——为多态基类声明virtual析构函数
  2. top命令行含义解析
  3. 【转载】《Unix网络编程》思维导图
  4. Eureka 简介
  5. 静态网页怎样实现动态交互?-JavaScript
  6. VB和VB.NET有什么区别
  7. Deepin-添加path
  8. Zookeeper开发常见问题
  9. taskTracker和jobTracker 启动失败
  10. the JSON object must be str, not &#39;bytes&#39;