import UIKit var greeting = "Hello, playground" //: [Previous](@previous) import Foundation //: #### 可选项 /*: 可选项: 一般也叫可选类型,它允许将值设值为nil - 非可选项的变量一般不允许设值为nil的 - 在类型名称的后面添加问号?来定义一个可选项 */ // 可选项定义示例 var name: String? = "Zhang Mengxu" name = nil // 可选项的默认值是 nil var age: Int? age = 10 print(age) age = nil //: #### 强制解包 /*: 强制解包 可选项是对其他类型的一层包装,可以将它理解为盒子 - 如果为nil,那么它是一个空盒子 - 如果不为nil,那么盒子里边装的是:被包装类型的数据 如果要从可选项中取出被包装的数据,需要使用感叹号! 如果对值为nil的可选项进行强制解包,将会产生运行错误。需要检测可选项是否包含值 - 强制转化后判断是否为nil - 可选项绑定(Optional Binding) */ // 强制解包 var age0: Int? = 10 var ageInt: Int = age0! ageInt += 20 // 判断可选项是否包含值 let number = Int("123") if number != nil { print("字符串转换成功,\(number!)") } else { print("字符串转换失败") } // 可选项绑定(Optional Binding) /*: 可以使用可选项绑定来判断可选项是否包含值 如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false */ if let number = Int( "123") { print("字符串转换整数成功:\(number) ") // number是强制解包之后的Int值 // number作用域仅限于这个大括号 }else { print("字符串转换整数失败") } enum Season: Int { case spring = 1, summer, autumn, winter } if let s = Season(rawValue: 3) { switch s { case .spring: print("The season is spring") default: print("The season is other") } } else { print("no such season") } // 可选项的并且关系, 可以用逗号进行表示 // first且second存在,并且first < second && second < 100 if let first = Int("4"), let second = Int("42"), first < second && second < 100 { print("-------------------") } // where循环中使用可选项绑定 var strs = ["10", "20", "abc", "-20"] var index = 0 var sum = 0 while let num = Int(strs[index]), num > 0 { sum += num index += 1 } print(sum) // 🈳合并运算符 /*: 空合并运算符 ?? a ?? b - a是可选项 - b是可选项或者不是可选项 - b跟a的存储类型必须相同 a ?? b 的取值 - 如果a不为nil,就返回a - 如果a为nil,就返回b - 如果b不是可选项,返回a时会自动解包 */ let a: Int? = 1 let b: Int? = 2 let c = a ?? b // c是Int? Optional(1) let a: Int? = nil let b: Int? = 2 let c = a ?? b // c是Int? Optional(2) let a: Int? = 1 let b: Int = 2 let c = a ?? b // c是Int, 2 // ?? 与if的使用 let a: Int? = nil let b: Int? = 2 if let c = a ?? b { print(c) } //: #### guard语句 /*: 基本语法 guard 条件 else { // do something 退出当前作用域 // return、break、throw } - 当guard语句的条件为false时,会执行大括号里边的代码 - 当guard语句的条件为true时,就会跳过guard语句 guard语句适合提前退出 */ // 登陆验证 guard let username = info ["username"] else { print("请输入用户名") return } // 隐式解包的定义 // 在类型的后边加上感叹号 ! let num1: Int! = 10 let num2: Int = num1 // 字符串插值的几种方式 var num3: Int? = 20 // 1. 强制解包 print("num3 is \(num3!)") // 2. 字符串的方法 String(describing: num3) print("num3 is \(String(describing: num3))") // 3. ?? 空合并运算符 print("num3 is \(num3 ?? 0)") //: 多重可选项 /*: 通过lldb指令 frame variable -R 或者 fr v -R 察看区别 必须是项目而非playground */ var num1: Int? = 10 var num2: Int?? = num1 var num3: Int?? = 10 print(num2 == num3) //: [Next](@next)