美文网首页
Swift-可选项

Swift-可选项

作者: X_L_F | 来源:发表于2019-09-27 20:23 被阅读0次

    可选项

    允许值为nil的类型,适用于所有的数据类型(枚举、Int、String、Class等)

    func score(_ score:Int) -> Int? {
      if score < 0 || score > 100 {
        return nil
      }
      return score
    }
    print(score(8))
    print(score(101))
    print(score(-2))
    // 结果:
    // Optional(8)
    // nil
    // nil
    

    可选项默认值初始值为nil

    字典与数组返回值

    字典

    /*:
    * 字典类型通过关键词取出来的为可选项
    */
    var dict = ["key1": "value1", "key2" : "value2"]
    print(dict["key1"])
    // 结果:Optional("value")
    

    数组

    /*:
    *   数组类型通过下标取出的为存储类型
    */
    var array = ["a", "b", "c", "d"]
    print(array[1])
    print(array[5])
    // 结果:
    // b
    // error 报运行时的数组越界
    

    可选项绑定

    可选项绑定可简化获取可选项包装的存储值。可以用于if、while中。

    let name: String? = "Jack"
    // 若name不为nil,对name进行强制解包,并赋予临时变量userName。否则执行else;
    if let userName = name {        
      // userName的有效作用域仅局限在大括号内
      print("\(userName)")
    } else {
      print("缺少昵称")
    }
    ```swift
    /*:
    *   例子:while中运用可选项绑定
    *   循环遍历,正数相加,遇到负数或者非数字而退出循环。
    */
    var strs = ["8", "9", "7", "q", "-1"]
    var sum = 0
    var index = 0
    while let num = Int(strs[index]), num > 0 {
        sum += num
        index += 1
    }
    print(sum)
    // 结果:24
    

    空合并运算符

    空合并运算符本质,可以用一下三元运算符表示

    a! = nil ? a! : b

    a 必须为可选项。若a不为空,则强制解包拿出a的存储类值,否则取b。

    b 则限制,作默认值用。

    let num1: Int? = 2
    print(num1 ? 3)
    // 结果:3
    

    多重可选项

    let num: Int?? = 1
    print(num ?? 2)
    // 结果:Optional(1)
    
    let num: Int?? = nil
    print((num ?? 1) ?? 2)  
    // 结果:1
    
    let num: Int??? = 1
    print(num ?? 1)
    // 结果:Optional(Optional(1))
    
    let num: Int??? = nil
    print((num ?? 1) ?? 2)
    // 结果:1
    

    当多重可选项值为nil时,与立即数机型比较时,会自动解包到最外一层。

    或、且的另一种写法

    利用可选项绑定,进行或、且计算,可简化过程

    /*:
    *   且运算
    */
    let name: String? = "Jack"
    let age: Int? = nil
    // 等价于 if name != nil && age != nil
    if let userName = name,
            let userAage = age {
          print("拿到资料")
    } else {
          print("拿不到资料")
    }
    // 结果:拿不到资料
    
    /*:
    *   或运算
    */
    let num1: Int? = nil
    let num2: Int? = 1
    // 等价于 if num1 != nil || num2 != nil
    if let num = num1 ?? num2 {
        print(num)
    }
    // 结果:1
    

    guard

    由于可选项绑定作用只有在括号范围内,为了使用绑定后的值,可以用guard关键词。

    // guard的常规写法
    guard condition else {
        // 条件不符合时运行
        statements  
    }
    
    /*:
    * 登录
    */
    func login(_ info: [String, String]) {
        guard let userName = info["userName"], userName.count > 0 else {
          print("请输入账号")
        }
    
        guard let password = info["password"], password.count > 0 else {
          print("请输入密码")
          return
        }
    
        print("账号:\(userName),密码:\(password)")
    }
    
    login(["userName": "Jack", "password": "12345"])
    login(["userName": "", "password": "12345"])
    // 账号:Jack,密码:12345
    // 请输入账号
    
    1. guard适用于提前退出操作
    2. guard的else内部得用return throw break continue break 等退出所在的作用域

    相关文章

      网友评论

          本文标题:Swift-可选项

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