Swift4 可选型, 可失败的构造函数

创建: 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 > 100, a < 200 {
    ...
} else {
    ...
}

 

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

 

 ● 也可以用在while, guard里

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

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

 guard 

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

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

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

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

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

 nil聚合运算符

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

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

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

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

 ● 可以连用, 短路评估

let sample = a ?? b ?? c ?? 0 // 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用

   
posted @ 2018-02-25 04:34  懒虫哥哥  阅读(193)  评论(0编辑  收藏  举报