您的位置:首页 > 移动开发 > Swift

Swift解包拆包方式

2016-07-19 14:39 387 查看
在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!


guard
if
的可选绑定有点类似,但是
guard
更好。
guard
主要有一下作用:

* 1. 对你所期望的条件做检查。如果条件不符合,guard的else语句就运行,从而退出这个函数。所以需要在else代码块中退出操作

* 2. 如果通过了条件判断,可选类型的变量在guard语句被调用的范围内会被自动的拆包。 (安全解包)

* 3. 对你所不期望的情况早做检查,使得你写的函数更易读,更易维护。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift 拆包解包