Swift中的可选项
缺乏资料
在某些情况下,我们希望接受用户的数据,同时也希望某些数据是可选的,这意味着它们不是必需的,但应在可能的情况下提供。
一个人的常量me
实例提供了所有数据,但另一个人常量不提供所有数据,因为他可能没有中间名。 因此,他将nil
作为middlename
的值。 听起来不错,但是传递的nil
会导致错误,为什么?,因为我们没有告诉swift将Middlename设为optional
。
Swift中的Optional是什么?
Swift中的可选类型是可以保存值或不保存值的类型。 可选项通过附加?
来编写?
任何类型:
var middlename:字符串?
上面的意思是Middlename可以是字符串,也可以不包含任何由?
表示的内容?
。 可选容器是一种容器。 可选的String是一个可能包含字符串的容器。 一个可选的Int是一个可能包含Int的容器 。 将可选件视为一种包裹。 在您打开它(或用可选语言“解开”)之前,您将不会知道它是否包含某些东西或什么都不包含。 它只是可以设置为nil
的Optional
值,这就是当我们向middlename
传递nil
值而未指定Optional
类型时发生错误的原因。
var red: String = "Red"
red = nil // error: nil cannot be assigned to type 'String'
如何创建一个可选的?
快速创建optional
的最简单方法是添加?
在下面的类型前面
var middlename:字符串?
另一种方法是使用如下所示的Optional关键字
var
middlename: Optional
使用(解包)可选
解开可选项的最简单方法是添加!
在可选名称之后。
注意\(middlename!)
可以用来解开中间名,因此我们可以获取值“ abel”。 问题在于,当我们将nil
值传递给中间名时,我们会遇到运行时崩溃的消息,提示nil is Unexpected
。
在展开之前,我们需要确保有一个值。 因此,在使用(展开)可选选项之前,我们将继续如何检查内容。
在强制展开之前,使用If检查是否为零:
由于在初始化Person结构时传递给变量的是nil
,因此我们可以使用if语句在展开Person
结构之前检查nil
,如下所示
每当我们使用!
符号,它表示为强制展开可选值,但这是避免强制展开可选值的一种常见做法,因为我们可以以这样的方式编写代码:swift会自动为我们解包
使用可选绑定:
通过可选绑定,尽管我们仍在使用if,但是swift为我们提供了一种使用if let
语句的方式,然后为我们自动将其解包,如下所示
使用Guard提前退出:
Guard提供了一种在检查optional
字符串时快速退出并使我们的代码更整洁的方法,因此将不需要if else
语句。
我们已经介绍了如何快速使用可选选项,让我们看一些可选的很酷的辅助用例,包括使用multiply optionals
, method chaining
和Nil Coalescing
。
Street类中的streetName
是一个可选字符串, House
类具有一个street变量,它也是一个可选Street。 Person类也有一个变量房屋,这是一个可选房屋。 当我们必须进入人街时。 要访问此人的街道(myStreet),我们不确定该人是否向我们提供了房屋信息(myHouse)。 这就是为什么我们使用if let myHouse = Person.house
。 如果Person.house
为空,则if语句将无法执行,否则该变量将分配给myHouse
属性。 接下来,我们必须访问myHouse.street
,如果可用,该变量将分配给myStreet
。
可以通过使用如下所示的可选链接来改进用于访问myStreet
的模式: