//Optional 是 Swift 的一大特色,
//定义变量的时, 如果指定是可选的,便是该变量有一个指定类型的值,也可以是nil
//定义变量的时, 如果在类型的后面添加一个 ?,表示该变量是可选的
//变量可选的默认值是nil
//常量可选项没有默认值,主要用于在构造函数中给常量设置初始数值
let x : Optional = 10
// 常量 x 的类型 是 Optional 可选的 原始的可选项定义
// Optional 包括如下两种:
// case none 没有值
// case some(Wrapped) 某一类值
// 推导的 let x: Optional<Int>
print(x) // 会警告 输出结果 Optional(10),提示这是一个可选值
print(x!) //解包 输出 10
print(x as Any) // 输出 10
let y : Int? = 20
// 简单的 定义 ' ? ' 用来定义 y 是一个可选的 Int 类型, 可能没有值,也可能有一个整数
print(y) // 输出 Optional(20)
//let z : Int? // Constant 'z' used before being initialized 常量 z 使用之前必须初始化
//let y : Int? = nil //如果下面用 y 计算 会报错 unexpectedly found nil while unwrapping an Optional value //初学者最常犯的错误 : 在 解包的时候发现 nil
// 不同数据类型不能直接运算 没有值 是 nil 不是任何数据类型,不能参与计算
// print(x + y)
// ' ! ' 强行解包 --从可选值中获取对应的值(非空值) 如果是 nil值 就会 奔溃程序
// 程序员 必须为每一个‘ !’ 负责
print(x! + y!)
```
总结:
定义可选项 使用 ?
解包使用 !
? 是在 定义时候用的
! 是在 解包用的,准备计算用的
程序中少用 !
/*
let possibleNumber: Int? = Int("42")
let possibleSquare = possibleNumber.map { $0 * $0 }
print(possibleSquare)
// Prints "Optional(1746)"
let noNumber: Int? = nil
let noSquare = noNumber.map { $0 * $0 }
print(noSquare)
// Prints "nil"
*/