美文网首页
Swift中的可选类型

Swift中的可选类型

作者: keisme | 来源:发表于2017-05-08 16:26 被阅读29次

1、可选类型概念

可选类型用来处理值可能缺失的情况。

下面的例子尝试将一个String转换成Int:

let possibleNumber = "123
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型"Int?"

可以给可选变量赋值为nil来表示它没有值:

var serverResponseCode: Int? = 404
serverResponseCode = nil

注意:
nil不能用于非可选的常量和变量。如果代码中有常量或者变量需要处理值缺失的情况,应该声明称对应的可选类型。

如果声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:

var surveyAnswer: String?
// surveyAnswer 被自动设置为nil

可选类型可以用 ?? 设置默认值:

var s: String?
var s1 = s ?? "xx"
print(s1) // print "xx"

注意:
Swift中的nil和Objective-C中的nil不一样。在OC中,nil是一个指向不存在对象的指针。在Swift中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。

2、强制解析

当你确定可选类型确实包含值之后,可以在可选的名字后面加一个感叹号(!)来强制解析获取值。

if  convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber).")
}

3、可选绑定

if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
    print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 输出 "'123' has an integer value of 123"

如果Int(possibleNumber)返回的可选Int包含一个值,创建一个叫做actualNumber的新常量并将可选包含的值赋给它。

4、隐式解析可选类型

有时候一个可选类型第一次被赋值后,可以确定它总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的。

这种类型的可选状态被定义为隐式解析可选类型。把想要用作可选类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。

隐式解析可选类型主要被用在Swift中类的构造过程中,请自行查阅相关资料。

下面的例子展示了可选类型和隐式解析可选类型之间的却别:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString!
// 需要感叹号来获取值

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString
// 不需要感叹号

注意:
如果一个变量之后可能变成nil的话不要使用隐式解析可选类型。如果需要在变量的声明周期中判断是否是nil的话,使用普通可选类型。

5. 可选类型的链式取值

传统写法:

var display: UILabel?
if let temp1 = display {
    if let temp2 = temp1.text {
        let x = temp2.hashValue
        ...
    }
}

链式写法:

if let x = display?.text?.hashValue {...} // x is an Int
   let x = display?.text?.hashValue {...} // x is an Int

相关文章

网友评论

      本文标题:Swift中的可选类型

      本文链接:https://www.haomeiwen.com/subject/unzmtxtx.html