对于写惯了 OC 代码的程序员来说,不判空直接调用对象方法可能已经成为习惯了;而当方法的返回值是对象时,通常也是拿来就用。这些情况在 Swift 下都不存在了,因为 Swift 中出现了一个全新的概念:Optional(? & !)。 Optional 用于表示一种值可能为空的对象类型。一个 Optional 对象表示了两种可能性:要么对象有值,你可以通过 “unwrap” 去获取到这个值;要么对象里面没有任何东西。 unwrap(解包):在对象后加 “?” 或 “!” 称为将对象 “unwrap”,可以获取到 Optional 里面的关联值 Optional 这个概念在 C 语言或 Objective-C 里面并不存在。在 OC 中最接近的概念是:本来要返回对象的方法可能会返回 nil,这个 nil 表示“没有有效的对象可以返回”;然而,这只在对象身上有效,它不能作用在结构体、基础 C 类型或枚举上。这些类型的变量如果没有值,OC 会用 Optional 解决了上述问题,在 Swift 中,Optional 可以处理任何类型的空值,而不需要用一个特殊的常量去表示。 举个栗子: 当我们需要将字符串转换为数字时,在 Swift 中会使用 let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
此时, 原因是这个构造器可能会失败: nil这里可以套用 OC 中的概念, var surveyAnswer: String?
// surveyAnswer == nil
本质上 Swift 的 在 OC 中, If 和强制解包可以使用 举个栗子: if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
当 Optional Binding这个机制可以用来判断一个 Optional 对象是否有值,如果有值就将它复制给一个局部变量或常量,否则不执行任何操作。 我们用 Optional Binding 来改写上一小节中的例子: if let actualNumber = Int(possibleNumber) {
print("\"\(possibleNumber)\" 是一个整型数字 \(actualNumber)")
} else {
print("\"\(possibleNumber)\" 不能被转化为整型")
}
当 在这种用法下, if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// 如果其中一个 Optional 没有值,或者最后那个判断的结果为 false,整个 if 判断会直接返回 false
通过 Optional Binding 声明的变量的作用于只在这个 隐式解包有时候,在特定的代码结构下,一个 Optional 对象可以被确保永远都有值(或者说理应永远都有值)。这种时候,每次使用这个对象都进行判空和解包就显得非常多余了,于是我们可以在声明这个对象的时候用隐式解包来处理: let forcedString: String!
print(forcedString) // 不需要写成 “forcedString!”
事实上,例子中的 链式调用如果我们要取得的对象被包裹在了一层又一层的 Optional 之中,取得它的过程可能非常繁琐: var label: UILabel?
if label != nil {
if let temp1 = label.text {
if let temp2 = temp1.hashText {
...
}
}
}
这时候,可以使用链式调用的方式改写: if let hashText = label?.text?.hashText {
...
}
在这句话当中, 默认值在一些情况下,我们会想要 Optional 对象为 一种很简便的写法是这样的: let s: String?
s = ...
label.text = s ?? "placeholder"
这样,当 总结Swift 中的 Optional 其实是一个 enum: enum Optional<T> {
case none
case some(T)
}
而它现在所见到的使用方法都可以认为是 Swift 的语法糖: let x: String?
// 等价于
let x = Optional什么?你想问这是哪门子的 enum?推荐你去看看官方文档 Enumeration 参考资料 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|