美文网首页swift学习
Swift5.1 - 可选项Optional(5)

Swift5.1 - 可选项Optional(5)

作者: HChase | 来源:发表于2019-06-26 00:10 被阅读47次

    1. 可选项的基本使用

    • 可选项也叫 可选类型,它允许值设置为nil
    • 在可选类型名称后面加一个 问号?,来定义一个可选项;
    var num:Int? = 10
    num = nil
    
    var name:String? // 默认是nil
    name = "Son"
    print(name)  // Optional("Son")
    

    2. 强制解包

    • 可选项是对其他类型的一层包装,可以理解为一个盒子;
    • 如果为nil,那么为空盒子;
    • 如果不位nil,那么盒子里装的是:被包装类型的数据;
    var name:String? // 默认是nil
    name = "Son"
    name = nil
    
    • 如果要从可选项中取出被包装的数据,需要使用 感叹号! 进行强制解包;
    var name:String? = "Son" // 默认是nil
    let name1 = name!
    print(name1)
    
    • 如果可选项的值为 nil,对其进行强制解包,将会报错闪退;

    3. 判断可选项是否包含值

    var name:String? // 默认是nil
    name = "Son"
    
    if name != nil {
        print("name = \(name!)")
    } else {
        print("name is nil")
    }
    

    4. 可选项绑定(Optional Binding)

    • 可以使用可选项绑定来判断可选项是否包含值;
    • 如果包含就自动解包,将值赋给一个临时的的常量(let)或变量(var),并返回true,否则返回false
    var name:String? // 默认是nil
    name = "Son"
    
    if let name = name {
        print("name = \(name)")
    } else {
        print("name is nil")
    }
    //  name = Son
    
    enum Score: Int {
        case a, b , c, d
    }
    
    if let score = Score(rawValue:5) {
        print("成绩存在 score = \(score)")
    } else {
        print("成绩不存在")
    }
    // 成绩不存在
    

    5. while循环中使用可选项绑定

    var strs = ["10", "20", "30", "ab", "40"]
    var index = 0
    var sum = 0
    while let num = Int(strs[index]), num > 0 {  // , 相当于 &&
        sum += num
        index += 1
    }
    
    print(sum)
    // 60
    

    6. 空合并运算符 ??

    public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
    
    • a ?? b
    1. a 是可选项;
    2. b 是可选项 或者不是可选项;
    3. b 跟 a 的存储类型必须相同;
    4. 如果 a 不为 nil,就返回 a;
    let a: Int? = 10
    let b: Int? = 20
    
    print(a ?? b)
    // Optional(10)
    
    1. 如果 a 为 nil,就返回 b;
    var a: Int?
    let b: Int? = 20
    
    print(a ?? b)
    // Optional(20)
    
    1. 如果 b 不是可选项,返回 a 时会自动解包;
    var a: Int? = 10
    let b: Int = 20
    
    print(a ?? b)
    // 10
    
    1. 多个 ?? 一起使用;
    let a: Int? = 10
    let b: Int? = 20
    let c = a ?? b ?? 30
    
    print(c) // c 为 Int ,10
    
    let a: Int? = nil
    let b: Int? = 20
    let c = a ?? b ?? 30
    
    print(c) // c 为 Int ,20
    
    let a: Int? = nil
    let b: Int? = nil
    let c = a ?? b ?? 30
    
    print(c) // c 为 Int ,30
    

    总结多个 ?? 一起使用时,最右边的类型决定结果是否时可选项,如果最右边是可选项,则结果是可选项,否则结果不是可选项;

    7. guard语句

    guard 条件 else {
        // do something ...
        退出当前作用域
        // return 、 break、continue、throw error
    }
    
    • 当 guard 语句的条件为 fasle 时,就会执行大括号里面的代码;
    • 当 guard 语句的条件为 true 时,就会跳过guard语句,执行后面代码;
    • 当使用 guard 语句进行可选项绑定时,绑定的常量(let)、变量(var)也能在外层作用域使用;
    let name: String? = "Son"
    
    guard let n = name else {
        return
    }
    print(n)
    

    8. 字符串插值

    • 可选项在字符串插值或直接打印时,编译器会发出警告;
    let name: String? = "Son"
    print("\(name)")
    
    • 消除警告
    let name: String? = "Son"
    print("\(name!)")
    
    let name: String? = "Son"
    print(String(describing: name))
    
    let name: String? = "Son"
    print("\(name ?? "")")
    

    相关文章

      网友评论

        本文标题:Swift5.1 - 可选项Optional(5)

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