Swift LearningNote: Optional & Forced Unwrapping & Optional Binding

·  阅读 385

本篇文章主要介绍的是swift代码中基础的相对与其他语言的一些特性和优秀的地方

可选项

## 定义 一般也叫可选类型,它是允许将值设置为nil的,表示方式就是在类型的后面加上? 来定义可选项
复制代码
    var a:Int?              var b:Int              
    var a:Int? = nil        var b:Int = 0
复制代码

左边的是等价的,右边就不一样了 举个🌰:

我定义一个数组,如果返回是数组内的成员就返回,如果不是就返回nil,但是这里报错了:'nil' is incompatible with return type 'Int' 这是为什么呢?可能以后在写swift代码中也一定会出现此类的错误 如果你的返回值有可能为空,又有可能返回值,那么就在返回值的后面加上?

这样便编译成功了...... 我们把它打印出来

这里就出现了我打印第一个的时候是数组的第二个,前面有个可选(optional)的选项,后面的-1和4都已经越界了

强制解包

可选项是对其他类型的一层包装,可以将它理解成一个盒子,如果为nil,表示是个空盒子,如果不为nil,表示盒子里面有被包装的数据
复制代码
    var age:Int?                            
    age = 10
    age = nil
复制代码

以上的代码可以理解成如下的图

如果要从可选项中取出数据就叫做解包,需要用感叹号!来强制解包
复制代码
    var age:Int? = 10                            
    var num = age + 11
复制代码
同学们看下,上面的代码有什么问题吗?自己可以尝试在pg里面尝试写一下,它会报错:
Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
这里就是说:你要用age来加上11 赋值给 变量num,但是num并不知道你里面有没有值,可选项可能会nil,所以要强制解包!
复制代码
    var age:Int? = 10                            
    var num = age! + 11
复制代码
我们这个时候不妨打印下age:发现还是optional(10),所以说强制解包只是把盒子里面值拿出来用一下,不能改变它
复制代码

如果对值为nil,也就是空盒子强制解包,就会出现运行时错误

判断可选项是否包含值

    var num = Int("xixi123")
复制代码

Int 进行强制解包这么个东西,到底是返回啥呢,给0 行不行?当然不行! 因为你可能Int里面的可能就是“0”,-1 一样。

如上图所示: 是个可选类型.

可选项绑定

可以使用可选项绑定来判断可选项是否包含值
如果包含就自动解包并且把值赋值给一个临时常量let或者变量var,并返回true/false
复制代码
    if let num = Int("123") {
    print("字符串转整数成功\(num)")
    }else{
    print("字符串转整数失败!")
    }
复制代码
这里自动解包成功以后,获取到num是值123,不是optional,因此不需要加!
复制代码

等价写法

    if let number = Int("4") {
        if let count = Int("32"){
            if number < count && count < 100{
                print("\(number) <\(count) < 100")
            } 
        }
    }
    // 4<32<100
复制代码

等价于:

    if  let number = Int("4"),
        let count = Int("32"),
        number < count && count < 100{
           print("\(number) <\(count) < 100")
        } 
    // 4<32<100
复制代码

空合并运算符??

    a??b
复制代码

注意:

1. a是可选项
2. b是可选或者是不可选项
3. 如果a不为nil,就返回a,如果a为nil,就返回b
4. 如果b不是可选项,返回a时候会自动解包
复制代码

内置函数看一下:

b是可选结果就是可选,b是非可选结果就是非可选

举个🌰:

多个??一起使用:

c_1, c_2, c_3 三个参数就是多个?? 一起使用的结果

??跟if let 配合使用

    let a:Int? = nil
    let b:Int? = 12
    if let c = a ?? b{
        print(c)
    }
    // 类似 if a!=nil || b!=nil
    if let c = a, d = b{
        print(c)
        print(d)
    }
    // 类似 if a!=nil && b!=nil
复制代码

上面代码,先看a??b,b是可选项,也就是结果也是可选项,就可以用可选项绑定处理

当以后如果变量中可能有nil的情况下,可以用这种组合拳去处理问题

guard语句

guard 条件 else {
    // do something...
    退出当前作用域
    //return,break,continue,throw error
}
复制代码

当guard 条件为false的时候才执行大括号里面的语句, 当guard 条件为true的时候就会跳出guard语句, guard 语句特别适合提前退出 当使用guard语句进行可选项绑定时,绑定的常量let,变量var 也能在外层作用域内使用

func login(_ info:[String:String]){
    guard let username = info["username"] else{
        print("请输入用户名")
        return
    }
    guard let password = info["password"] else{
        print("请输入密码")
        return
    }
}
复制代码

隐式解包

let num11 : Int? = 10
let num22 : Int = num11
复制代码

在某种情况下,可选项一旦被设定了值,就会一直拥有它,不必要每次访问都去进行解包,因为它每次访问都有值,这种可选值赋值是需要解绑

let num11 : Int! = 10
let num22 : Int = num11
复制代码

? 要改成!,先要进行强制解包

多重可选项

分类:
iOS
标签: