Swift可选类型与可选绑定

所属分类:ios | 发布于 2022-12-04 21:14:23

Swift中使用可选类型(optional)来处理值可能缺失的情况。这部分的内容包含以下几个知识点。

  • 可选类型基本概念
  • nil
  • if语句以及强制解包
  • 可选绑定
  • 隐式解析可选类型

可选类型基本概念

Swift中使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示有两种可能:或者有值,你可以解析可选类型访问这个值,或者根本没有值。

let convertedNumber = Int(possibleNumber)
// convertedNumber 被推断类型为Int?,或者类型"optional Int"

这个例子中,如果possible是123,convertedNumber就是有值,如果possibleNumber是hello,world,convertedNumber就是没有值。

因为该构造器可能会失败,所以它返回一个可选类型(optional) Int,而不是一个Int。一个可选的Int被写作Int?而不是Int。问号暗示包含的值是可选类型,也就是说可能包含Int值也可能不包含值。(不你包含其它任何值比如Bool值或者String值,只能是Int或者什么都没有)。

nil

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

var serverResponseCode: Int? = 404
// serverResponseCode 包含一个可选的Int值 404
serverResponseCode = nil
// serverResonponseCode 现在不包含值

nil不能用于非可选的类型和常量。如果你的代码中有常量或变量需要处理值缺失的情况,请把它们声明为对应的可选类型。

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

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

if语句以及强制解包

可以使用if语句和nil来比较判断一个可选值是否包含值,你可以使用相等==或者不等!=来执行比较。

如果可选值有值,它将不等于nil:

if convertedNumber != nil {
    print("convertedNumber containes some integer value.")
}

当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示"我知道这个可选有值,请使用它"。这个过程被称为可选值的强制解包(forced unwrapping):

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// 输出”convertedNumber has an integer value of 123.“

注意:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解包值之前,一定要确定可选包含一个非nil的值。

可选绑定

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时的变量或者常量。可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或变量。

在if语句中使用可选绑定语法

if let constantName = someOptional {
    statements
}

使用可选绑定来重写在可选类型中举出的possibleNumber的例子:

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的新常量并将可选包含的值赋给它”。

如果转换成功,actualNumber常量可以在if语句的第一个分支中使用。它已经被可选类型包含的值初始化过,所以不需要再使用!后缀来获取它的值。

你可以包含多个可选绑定或多个布尔条件在一个if语句中,只要使用逗号分开就行。

另外一个示例:

if let movie = item as? Movie {
    print("Movie: \(movie.name), dir. \(movie.director)")
}

可选绑定"if let movie = item as? Movie"可以这样解读:"尝试将item转为Movie类型。若成功,设置一个新的临时变量movie来存储返回的可选Movie中的值"。

 

隐式解析可选类型

对于可选类型,在程序架构中,第一次被赋值之后,可以根据一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。

这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionsl)。把需要用作可选类型的后面的问号(String?)改为感叹号(String!)来声明一个隐式解析可选类型。与其在使用时把感叹号放在可选类型的名称的后面,你可以在定义它时,直接把感叹号放在可选类型的后面。

隐式解析可选类型主要被用作Swift中类的构造过程中。

一个隐式解析可选类型就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。下面的例子展示了可选类型String和隐式解析可选类型String之间的区别:

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

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

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接