Swift

Swift Day03 枚举 可选项

2020-11-24  本文已影响0人  望穿秋水小作坊

一、枚举

1. 枚举(enum)的基本写法?
//1. 定义一
enum Direction {
    case north
    case south
    case east
    case west
}
//2. 定义二
enum Direction2 {
    case north, south, east, west
}
//3. 使用枚举
var dir = Direction.west
dir = Direction.east
dir = .south
print(dir)
2. 枚举(enum)的关联值(Associated Value)?
enum Score {
    case points(Int)
    case grade(Character)
}

var score = Score.points(96)
score = .grade("A")

switch score {
case let .points(i):
    print(i, "Points")
case let .grade(i):
    print("grade",i)
}
3. 枚举(enum)的原始值(Raw Values)?
enum Grade : String {
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}

var studentGrade:Grade = .perfect
studentGrade = .good
print(studentGrade) // good
print(studentGrade.rawValue) // C
4. MemoryLayout 有什么用?
//1.原始值
enum Grade : String {
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}
MemoryLayout<Grade>.size    //1
MemoryLayout<Grade>.stride  //1
MemoryLayout<Grade>.alignment //11

//2.关联值
enum Password {
    case number(Int, Int, Int, Int)
    case other
}
MemoryLayout<Password>.size    //33
MemoryLayout<Password>.stride  //40
MemoryLayout<Password>.alignment //8
5. 思考为什么原始值,无论是 Int 还是 String 都只需要一个字节就能存储枚举变量?
6. 思考 Password 的枚举变量,为什么 32 个字节不够呢?

二、可选项(Optional)

1. 可选项的基本概念
var name: String? = "Jack"
name = nil

var age: Int? // 如果可选项不赋予初始值,默认就是 nil
age = 10
age = nil

var array = [1, 15, 40, 29]
func get(_ index: Int) -> Int? {
    if index < 0 || index >= array.count {
        return nil
    }
    return array[index]
}
print(get(1)) //Optional(15)
print(get(-1)) //nil
print(get(4)) //nil
2. 什么是强制解包(Forced Unwrapped)?
解包
3. 什么是可选项绑定(Optional Binding) ?
let number = Int("123") // number 的类型是 Int?
if number != nil {
    print("字符串转换整数成功: \(number!)")
} else {
    print("字符串转换整数失败")
}
 if let number = Int("123") {
    print("字符串转换整数成功: \(number)")
    //number 是强制解包之后的 Int 值
    //number 作用域仅限于这个大括号
} else {
    print("字符串转换整数失败")
}
4. 通过下面的例子,加强认知可选项绑定(Optional Binding) ?
var strs = ["10", "20", "abc", "-20", "30"]
var index = 0
var total = 0
while let number = Int(strs[index]), number > 0 {
    total += number
    index += 1
}
print(total) // 30
5. 空合并运算符 ?? (Nil-Coalescing Operator)
public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
var a: Int? = 10
var b = 2
let c = a ?? b // c 是 Int, 值是 10

var d: Int? = nil
var e: Int? = 2
let g = d ?? e // g 是 Int?, 值是 2
6. guard 语句(通常用在什么情况?)
guard 条件 else {
  //do something
  退出当前作用域
  // return、break、continue、throw error
}
7. 隐式解包(Implicitly Unwrapped Optional)
let num1: Int! = 10
let num2: Int = num1
if num1 != nil {
    print(num1 + 6) //直接使用,不需要解包
}
if let num3 = num1 {
    print(num3)
}
8. 可选项在字符串插值或者直接打印时,编译器会发出警告,如何解决?(3 种思路)
var age: Int? = 10
print("My age is\(age)")
var age: Int? = 10
print("My age is\(age!)")
print("My age is\(age ?? 0)")
print("My age is\(String(describing: age))")
9. 多重可选项,以及如何查看多重可选项结构?
image.png
上一篇 下一篇

猜你喜欢

热点阅读