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. 对你所不期望的情况早做检查,使得你写的函数更易读,更易维护。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拆包解包是Python中非常常见的操作。在Python中,拆包是指将一个可迭代对象(如列表、元组等)中的元素分别赋值给多个变量的过程。解包则是相反的操作,将多个变量的值打包成一个可迭代对象。这种操作非常方便,可以一次性地同时操作多个变量。 拆包操作可以通过以下方式进行: a, b = b, a 这个操作实际上是利用元组的特性进行拆包,将b和a构成一个元组,然后将元组的值分别赋给a和b。这样就实现了变量的交换。 另外,拆包操作也可以应用在函数调用、列表解析和生成器表达式等地方。通过将一个可迭代对象拆解成多个变量,可以方便地传递参数、操作数据等。 解包操作符包括*和**。*可迭代解包操作符可以将一个可迭代对象拆解成多个元素,而**字典解包操作符可以将一个字典拆解成多个键值对。这些操作符的使用可以在函数调用、推导式和生成器表达式中灵活地进行解包操作。 更详细的信息可以参考PEP448,它提出了*可迭代解包操作符和**字典解包操作符的扩展用法,允许在更多位置、任意次数和其他情况下进行解包操作。同时,还可以参考相关的资料,如GeeksforGeeks和CSDN的文章,来了解更多关于拆包解包的示例和用法。123 #### 引用[.reference_title] - *1* [python基础语法之拆包(解包)](https://blog.csdn.net/qq_41621362/article/details/105437215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [python中的装包和解包](https://blog.csdn.net/water19111213/article/details/107642335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [Python中的解包用法](https://blog.csdn.net/cnds123/article/details/129885450)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值