Swift5.1 学习(三)

枚举

  • 基本用法:
  • 关联值:有时会将枚举的成员值跟其他类型的关联存储在一起,会非常有用
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)
}
  • 原始值:枚举成员可以使用相同类型的默认值预先关联

    enum PokerSuit : Character {
        case spade = “黑桃”
        case heart = “红心”
        case club =.“梅花”
        case diamond = “红钻”
    }
    print(PokerSuit.spade.rawValue)
    // 隐式原始值:如果枚举的原始值类型是Int、String类型,swift会自动分配原始值;String类型按照定义名称设置为原始值;Int类型和c语音设置一样
    
  • 递归枚举

    indirect enum ArithExpr{
        case number(Int)
        case sum(ArithExpr, ArithExpr)
        case difference(ArithExpr,ArithExpr)
    }
    let five = ArithExpr.number(5)
    let four = ArithExpr.number(4)
    let two = ArithExpr.number(2)
    let sum = ArithExpr.sum(five, four)
    let difference = ArithExpr.difference(sum, two)
    
  • MemoryLayout :获取数据类型占用内存大小

    var age = 10
    MemoryLayout.size(ofValue: age)
    // 分配占用的空间大小
    MemoryLayout.size
    // 分配占用的空间大小    
    MemoryLayoutstride
    // 内存对齐    
    MemoryLayout.alignment
    // 这个只占一个字节(设定了原始值的也只占1个字节,只有关联值才会存储进去)
    enum season {case spring,summer,autumn,winter}
    

可选项

  • 定义:又称可选类型,允许定义的数据返回nil(意思就是原本所有的数据类型都不能设置为nil),只需要在定义类型后面补充个 (?)即可,可选项类型默认有初始值nil

    EX1:
    var name :String? = “Jack”
    name = nil
    
    EX2:
    var array = [10,20,30,40]
    func get(_ index:Int) ->Int? {
        if (index < 0 || index >= array.count) {
            return nil
        }
        return array[index]
    }
    
  • 强制解包:
    1、可选值本质是对其他类型的一个包装,可以将它理解为一个盒子。
    2、如果是nil代表的是一个空盒子,如果不是nil盒子内装的就是被包装的数据类型。
    3、如果要从可选项中取出被包装的数据,则需要在可选项后使用“!”进行强制解包。
    4、这个过程不会改变原本的可选值,只是拿出里面包装的类型使用
    5、对nil(空盒子)进行强制解包,运行时会报错

  • 可选项绑定:
    1、可以判断可选项是否有值
    2、如果包含则自动解包赋值给let 或者 var并返回true,否则返回false
    3、while也可以使用

    if let number = Int(“123”) {
        print(\(number))
        // 结果是123,并非Optional(123)
    }else {
        xxx
    }
    
    // 可选项绑定判断不能用&& ,需要用逗号(,)
    if let first = Int(“10”), let second = Int(“20”), (first < second && second < 100) {
        xxx
    }
    
  • 空合并运算符(??)
    a ?? b
    条件说明:
    1、a一定是可选项,b不一定是可选项
    2、a如果不是空盒子(nil)则返回a,否则返回b
    3、如果b不是可选项,返回a的时候,会自动解包
    4、b和a的类型需要相同,如果b不是可选值,则要和a解包后的格式相同
    5、多个运算符,数据类型只看最后一个数值,再从左到右运算
    6、补充:字典根据key取出来的数据是可选类型;数组根据下标取出数据是真实数据类型,因此数组需要做防止越界处理

    // ??与if let同用
    let a :Int? = nil
    let b :Int? = 2
    if let c = a ?? b {
        // 类似if a!=nil || b != nil
    }
    let a :Int? = nil
    let b :Int? = 2
    if let c = a , let d = b {
        // 类似if a!=nil && b != nil
    }
    
    
  • guard语句
    说明:
    1、当条件为false进入guard条件语句,否则跳过。
    2、适合用于提前退出
    3、使用guard可选项绑定的时候,绑定的数值可用于判断语句外部
    guard 条件 else { // 一定要退出当前作用域:reutrn,break,continue,throw error } // 可用于判断登陆用户名以及密码模块

  • 隐式解包
    说明:
    1、某些情况下,可选项一旦被设定值后,就确定一定有值;
    2、如果确定有值,我们去掉对该值的检查,也不必每次都强制解包
    3、使用场景主要是确定对方传给我们值,如果是nil不做处理
    ```
    // num1本质还是可选项类型
    let num1:Int! = 10
    let num2 :Int = num1

      // ps:可选项是空值使用解包还是会报错
      let num1: Int! = nil
      let num2:Int = num1
      ```
    
  • 字符串插值
    var age :Int? = 10 print(“my age is \(age)”) // 这种写法是会有️的 // 消除️的三种方法 // ️:解包:my age is 10 print(“my age is \(age!)”) // ️:将字符描述打印出来:my age is optional(10) print(“my age is \(String(describing: age))”) // ️:空合并运算符:my age is 10 print(“my age is \(age??0)”)

  • 多重可选项
    ```
    // ️
    let num1 :Int? = 10
    let num2 :Int?? = num1
    let num3 :Int?? = 10
    // 解释:num2 == num3 都是包了两层的optional

      // ️
      let num1 :Int? = nil
      let num2 :Int?? = num1
      let num3 :Int?? = nil
      // 解释:num2 != num3 num3实际是只包了一层的nil
      
      // ❕❕可以使用lldb指令查看区别:断点处是输入 help frame variable -R  或者简写(fr v -R)查看
      ```
    

你可能感兴趣的:(Swift5.1 学习(三))