美文网首页
Swift5.1学习随笔之可选项Optional

Swift5.1学习随笔之可选项Optional

作者: SAW_ | 来源:发表于2020-04-13 16:38 被阅读0次

    可选项 Optional

    先看下这几句代码:在Swift中,默认情况下,这些类型不能直接设置为nil,只有声明为可选类型才可以设置空值

    var str: String = "123"
    str = nil //报错:'nil' cannot be assigned to type 'String'
    
    var age: Int = 10
    age = nil //报错:'nil' cannot be assigned to type 'Int'
    

    1、可选项,一般也叫做可选类型,它允许将值设为nil
    2、在类型名称后面加个问号?,来定义一个可选项

    var str: String? = "123"
    str = nil
    
    var age: Int? = 10
    age = nil 
    
    var age1: Int? // 默认就是nil
    age1 = 10
    age1 = nil
    

    注意点:

    var age: Int //没有初始值
    print(age) //报错:Variable 'age' used before being initialized
    
    var age: Int? //初始值为nil  相当于:var age: Int? = nil
    print(age)
    

    使用例子🌰:get函数从组数array中取值,如果传入的index大于array的个数,代码会崩溃,所以返回值可以设置为可选类型Int?,如果index超出,就返回nil,保证代码安全。

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

    强制解包 Forced Unwrapping

    1、由于可选项是对其他类型的一层包装,可以理解为一个盒子
    如果为nil,那么它是一个空盒子
    如果不为nil,那么盒子里面装的是:被包装类型的数据

    2、要从可选项中取出被包装的数据,需要使用感叹号!进行强制解包

    因为age的类型是可选项Int?,并不是Int,不能直接跟20相加,类型不一致

    var age: Int? = 10
    var num = age + 20 //报错:Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
    

    进行强制解包!之后,类型一致,可以相加

    var age: Int? = 10
    print(age) // Optional(10)
    let ageInt: Int = age!
    print(ageInt) //10
    var num = ageInt + 20
    print(num) // 30
    

    强制解包不影响age的值,依然是Optional(10),只是拿出来使用而已

    3、如果对值为nil的可选项(空盒子)进行强制解包,将会产生运行时错误

    var age: Int?
    age! //报错:Expression resolves to an unused variable
    

    判断可选项是否包含值

    let number = Int("123")
    print(number) //Optional(123)
    
    let number1 = Int("abc")
    print(number1) //如果转换失败,number为nil
    
    if number != nil {
        print("转换成功 == \(number!)")
    }
    else {
        print("转换失败")
    } //转换成功 == 123
    

    可选项绑定 Optional Binding

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

    if let number = Int("123") {
        print("转换成功 == \(number)") //不需要再加感叹号!
        // number是强制解包之后的Int值
        // number作用域仅限于这个大括号
    }
    else {
        print("转换失败")
    } //转换成功 == 123
    
    enum Season: Int {
        case spring = 1, summer, autumn, winter
    }
    if let season = Season(rawValue: 6) { //Season不存在原始值为6的成员
        switch season {
        case .sprint:
            print("the season is spring")
        default:
            print("the season is other")
        }
    }
    else {
        print("no such season")
    } //no such season
    

    等价写法

    可选项绑定中的条件并列,不能用&&书写隔开,必须用逗号,隔开

    if let a = Int("4") {
        if let b = Int("42") {
            if a < b && b < 100 {
                print("\(a) < \(b) < 100")
            }
        }
    } // 4 < 42 < 100
    
    if let a = Int("4"), let b = Int("42"), a < b && b < 100 {
        print("\(a) < \(b) < 100")
    } // 4 < 42 < 100
    

    while循环中使用可选项绑定

    var strs = ["10", "20", "abc", "-20", "30"]
    var index = 0
    var sum = 0
    while let num = Int(strs[index]), num > 8 {
        sum += num
        index += 1
    }
    print(sum) // 30
    

    隐式解包 Implicitly unwrapped Optional

    1、在某些情况下,可选项一旦被设定值之后,就会一直拥有值
    2、在这种情况下,可以去掉检查,也不必每次访问都进行解包,因为它能确定每次访问都有值
    3、可以在类型后面加个感叹号!定义一个隐式解包的可选项

    let num1: Int! = 10
    let num2: Int = num1
    if num1 != nil {
        print(num1 + 6) // 16
    }
    if let num3 = num1 {
        print(num3) // 10
    }
    
    let num1: Int! = nil
    let num2: Int = num1 // 运行崩溃:Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
    

    相关文章

      网友评论

          本文标题:Swift5.1学习随笔之可选项Optional

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