Swift解包拆包方式

在Swift中变量是可以设置为可选的如下 (以下没有特殊声明,均在xCode8.0beta, Swift3.0中测试的)

var aString:String?  // var aString:Optional<String>;

那如何在Swift解包呢。 这里有几种解包方式:

第一种 强制解包 使用符号?拆包

例如:

var aString:String? = "Testttttttttt"
print(aString!) //  Testttttttttt   - 强制解包
print(aString)  // Optional("Testttttttttt")

但是这有个问题。假如aString没有被赋值,强制解包时,程序会直接闪退。所以这种是不安全的解包方法。(不安全解包)

第二种 隐式拆包变量声明

例如:

var aString:String! = "Testttttttttt"
print(aString!)
print(aString)

没有初始化时,就打印aString,程序会直接闪退。所以这种是不安全的解包方法。(不安全解包)
但是在以下情况,就必须使用隐式解包
* 1. 对象属性在初始化的时候不能nil,否则不能被初始化。典型的例子是Interface Builder outlet类型的属性,它总是在它的拥有者初始化之后再初始化。在这种特定的情况下,假设它在Interface Builder中被正确的配置——outlet被使用之前,保证它不为nil。
* 2. 解决强引用的循环问题。当两个实例对象相互引用,并且对引用的实例对象的值要求必须有值时候。在这种情况下,引用的一方可以标记为unowned,另一方使用隐式拆包。

第三种 可选绑定

例如:

var aString:String?
if let str = aString {
    print(aString!)
} else {
    print("aString have no value")
}

不管aString有没有初始化,在if中都可以放心去拆包。aString没有初始化或者没有值(nil),程序都不会进入if代码块中,所以这是一种(安全解包)

第四种 可选链 (自判断链接)

可选链是一种可以请求和调用属性、方法和子脚本的过程,用于请求或调用的目标可能为nil,如果目标有值,调用就会成功,如果目标为nil,调用将返回nil,多次请求或调用可以被链接成一个链,如果任意一个节点为nil将导致整条链失效。通俗的来说就是请求和调用属性、方法时,含有一个或多个的返回值为可选值的一次调用就是可选链

注意:Swift 的自判断链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使用在任意类型中,并且失败与否可以被检测到
例如:

class Clazz {
    var clazzName:String?
}

class Student {
    var name:String?
    var clazz:Clazz?

    init() { }
    init(_ clazz:Clazz) {
        self.clazz = clazz
    }

    func getName() -> String? {
        return name;
    }
}=
let c:Clazz = Clazz()
let p:Student = Student()
let p1:Student = Student(c)
print(p.clazz?.clazzName)  // 打印可选链   nil
print(p1.clazz?.clazzName)  // 打印可选链  nil

c.clazzName = "终极一班"
print(p1.clazz?.clazzName)  // 打印可选链  // Optional("终极一班")

运行之后,p的属性clazz没有被初始化,程序也不会闪退。p1的属性clazz被初始化了,但是打印没有被初始化的clazzName属性时,程序照常运行。可见可选链也是(安全解包)
最后调用的是一个可选值,那么返回的也是一个可选值

第五种 Nil Coalescing (空值合并运算符) , swift3.0以后 不支持

例如: (xCode7.3 Swift2.0中测试)

var aString:String?
print (aString ?? "Tesssst")

第六种 guard 语句

func testStr(aString:String?) {
    guard let str = aString where str != "Test" else {
        print("Not Satisfied!")
        return
    }
    // str is available to use
    print("Satisfied!")
}
testStr(aString: "Test---")  // Satified!
testStr(aString: "Test")    // Not Satified!

guardif 的可选绑定有点类似,但是guard更好。guard主要有一下作用:
* 1. 对你所期望的条件做检查。如果条件不符合,guard的else语句就运行,从而退出这个函数。所以需要在else代码块中退出操作
* 2. 如果通过了条件判断,可选类型的变量在guard语句被调用的范围内会被自动的拆包。 (安全解包)
* 3. 对你所不期望的情况早做检查,使得你写的函数更易读,更易维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值