185 lines
4.0 KiB
Swift
185 lines
4.0 KiB
Swift
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)
|