美文网首页swift
swift 可选项(Optional)

swift 可选项(Optional)

作者: 奋斗的小马达 | 来源:发表于2021-12-09 14:31 被阅读0次

    一、定义

    可选项、一般也叫可选类型,它允许将值设置为nil

    二、表现形式

    在类型名称后面加个 ?(问号)来定义一个可选项

    例:

    var name: String = "Jack"
    name = nil
    
    报错.png

    如上图所示:在默认情况下 是不允许将值置为nil
    只有将其声明为可选类型才可以将值置为你了 如下两种方式

    name 为可选类型 默认设置了初始值

    var name: String? = "Jack"
    name = nil
    

    age没有设置初始值 但是默认情况就是 nil

    var age: Int?
    age = 10
    age = nil
    

    注意区分:
    如果声名一个变量 但是没有赋初始值 我们就无法使用这个变量 如下

    func test() {
            var age: Int
             print(age)
    }
    

    如果我们只是声名了这个变量 但是并没有给其赋值 它是没有默认值的 然后你去使用它 就会报错 如下


    报错

    这一点 要和可选项分开 可选项如果不设置默认值 它的默认值就是 nil

    三、应用场景

    比如 自定义一个函数 传入一个下标 返回数组对应的元素

    var array = [1, 15, 40, 29]
    func get(_ index: Int) -> Int? {
        if index < 0 || index >= array.count {
            return nil
        }
        return array[index]
    }
    

    如果返回值 定义为可选项
    我们传入的下标 大于数组的长度 在此时就会返回nil

    如果返回值 定义的不是可选类型
    我们传入的下标 大于数组的长度 在此时就会奔溃报如下错误

    Fatal error: Index out of range
    

    四、可选项取值

    1、强制解包

    强制解包(也就是取值) 就是直接在变量后面加一个 !(感叹号) 这样就把值给取出来了
    例:直接打印变量

    var num: Int? = 10
    print(num)
    
    打印结果是:Optional(10)
    

    例:打印强制解包的变量

    var num: Int? = 10
    print(num!)
    
    打印结果是:10
    

    之所以产生上述原因 是因为 num 并不是Int类型的数据 它的类型是 Int?
    所以 我们也无法直接与Int类型的数据相加
    例:

    var num: Int? = 10
    var num1 = num + 5
    print(num1)
    
    编译直接报错
    Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
    
    意思就是我们不能将 一个Int? 类型的数据 与 Int类型的数据相加
    

    注意:如果对一个可选项 值为nil 的变量 进行强制解包 也会报错 所以我们在强制解包的时候一定要确定 变量值不为 nil

    var num: Int?
    print(num!)
    
    报错:Fatal error: Unexpectedly found nil while unwrapping an Optional value
    

    2、可选值绑定

    概念:
    1、可以使用可选项绑定来判断可选项是否包含值
    2、如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false

    例:将字符串强转int (结果是 有可能转换成功 也有可能转换失败 )

    if let number = Int("123") {
        print("字符串转换整数成功:\(number)")
        // number是强制解包之后的Int值
        // number作用域仅限于这个大括号
    }
    

    例:根据key值到字典中取出对应的value (结果 如果有对应的key 则取出 如果没有对应的key 则返回nil)

    var dict = ["a":"A","b":"B","c":"C"]
    
    let str = dict["a"]
    print(str) // 打印结果:Optional("A")
    
    if let str1 = dict["b"]{
        print(str1) //打印结果:B
    }
    
    if let str2 = dict["d"]{
        print(str2)// 这个方法根本不会走
    }
    

    3、空合并运算符 ??

    规则:
    a ?? b
    1、 a 是可选项
    2、b 是可选项 或者 不是可选项
    3、b 跟 a 的存储类型必须相同
    如果 a 不为nil,就返回 a
    如果 a 为nil,就返回 b
    如果 b 不是可选项,返回 a 时会自动解包

    例1: a为可选项 初始值不为nil b (可以是可选项 也可以不是可选项)

    var a:Int? = 10
    var b:Int? = 20
    print(a ?? b)
    
    打印结果为:Optional(10)
    

    例2: a为可选项 初始值为nil b 是可选项

    var a:Int? = nil  //或 var a:Int?
    var b:Int? = 20
    print(a ?? b)
    
    打印结果为:Optional(20)
    

    例3: a为可选项 初始值为nil b 不是可选项

    var a:Int? = nil  //或 var a:Int?
    var b:Int = 20
    print(a ?? b)
    
    打印结果为:20
    

    例4: a为可选项 初始值不为nil b 不是可选项

    var a:Int? = 10
    var b:Int = 20
    print(a ?? b)
    
    打印结果为:10
    

    所以 我们在使用 空合并运算符 ?? 来获取可选项的值时 后面经常会跟一个与 可选项 值类型相同的 非可选项
    如下

    var a:Int? = 10
    print(a ?? 0)  打印结果:10
    
    var b:String? = "这是一个字符串"
    print(b ?? "") //打印结果:这是一个字符串
    
    

    相关文章

      网友评论

        本文标题:swift 可选项(Optional)

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