美文网首页
Swift5.1 学习(三)

Swift5.1 学习(三)

作者: 程序猿在公元前 | 来源:发表于2020-02-16 16:53 被阅读0次

    枚举

    • 基本用法:
    • 关联值:有时会将枚举的成员值跟其他类型的关联存储在一起,会非常有用
    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<Int>.size
      // 分配占用的空间大小    
      MemoryLayout<Int>stride
      // 内存对齐    
      MemoryLayout<Int>.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 学习(三)

          本文链接:https://www.haomeiwen.com/subject/mmqmfhtx.html