Swift LearnigNote: Optional & Forced Unwrapping & Optional Binding

本篇文章主要介绍的是swift代码中基础的相对与其余语言的一些特性和优秀的地方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
复制代码

以上的代码能够理解成以下的图app

若是要从可选项中取出数据就叫作解包,须要用感叹号!来强制解包
复制代码
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 同样。ui

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

可选项绑定

可使用可选项绑定来判断可选项是否包含值
若是包含就自动解包而且把值赋值给一个临时常量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
复制代码

等价于:spa

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

空合并运算符??

a??b
复制代码

注意:3d

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

内置函数看一下:code

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

举个🌰:cdn

多个??一块儿使用:

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是可选项,也就是结果也是可选项,就能够用可选项绑定处理blog

当之后若是变量中可能有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
复制代码

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

多重可选项

相关文章
相关标签/搜索