Swift Optional介绍和详细用法示例

本文概述

Swift可选是Swift编码的基本部分。 Optional用于将良好代码与错误代码分开并防止崩溃。每种编程语言都有一些预防措施来避免崩溃。在这种情况下, Swift更为实用, 并且可以选择使代码免于崩溃。

Optional

enum Optional<Wrapped>

每当你使用可选值时, 都会使用可选类型, 即使你从未键入”可选”一词也是如此。 Swift的类型系统通常显示包装的类型名称以及问号(?), 而不显示完整的类型名称。

例如, 如果变量的类型为Int ?, 则它是相同的, 只是编写Optional的另一种方式。此简短形式仅用于使代码容易和简单。

请参见以下示例。

此处, 以下代码示例中的shortForm和longForm的类型相同:

let shortForm: Int? = Int("143")
Or
let longForm: Optional<Int> = Int("143") 
//Both are same

可选, 不保留任何值或保留一些值。可选允许将nil存储为缺少值。可选的是具有两种情况的通用枚举:

  • Optional.none:等效于nil文字。
  • Optional.some(Wrapped):存储包装的值。

例子

let number: Int? = Optional.some(143)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"

输出

true

上面程序中的问号(?)表示它是一个可选变量。如果在变量声明的末尾看到问号, 则它肯定是可选的, 并且其中可能包含也可能不包含值。因此, 在程序的某些部分, 你不知道变量是否有值, 然后将其标记为可选。

现在, 看下面的例子:

在这里, 我们尝试打印变量’numberOfStudents’的值。

var numberOfStudents : Int?
print(numberOfStudents!)

在此, 变量末尾的感叹号(!)用于解包该值。但是, 如果尝试执行代码, 则代码将崩溃。这是因为, 你只需要强制解开一个没有值的可选变量即可。如果变量中没有值, 则程序将崩溃。

为变量设置一个值

如果在强制解开该值之前为变量设置了一个值, 则代码不会崩溃, 但这不是一种好的编码习惯, 也不是可选变量的滥用。

var numberOfStudents : Int?
numberOfStudents = 30
print(numberOfStudents!)

输出

30

你可以在强制打开可选包装之前进行零检查。

例如:

var numberOfStudents : Int?
if numberOfStudents != nil {
print(numberOfStudents!)
}

现在, 你的程序将不会崩溃, 因为只有在执行nil检查后才强制展开可选变量。

var numberOfStudents : Int?
if let studentCount = numberOfStudents {
print(studentCount) // It is same as print(numberOfStudents!)
}

上面的方法将检查可选变量’numberOfStudents’是否包含某些值。如果存在, 则将其复制到一个名为StudentCount的常量, 然后仅执行代码块。

强制展开

当你将变量定义为可选变量然后要从该变量中获取值时, 必须将其解包。强制展开是在变量末尾添加感叹号的过程。

让我们看一个例子以使之清楚。

示例:(在应用展开之前)

var userString:String?
userString = "Hello World"
if userString != nil {
   print(userString)
} else {
   print("userString has nil value")
}

输出:执行以上代码时, 将给出以下输出:

Optional("Hello World")

示例:(应用展开后)

现在, 我们应用展开以获取正确的变量值。

var userString:String?
userString = "Hello World"
if userString != nil {
   print(userString!)
} else {
   print("userString has nil value")
}

输出

Hello World

自动展开

自动展开提供了一种使用感叹号而不是问号声明可选变量的方法。通过这种方式, 变量将自动展开, 并且你不需要在变量末尾使用任何其他的感叹号来获取分配的值。

让我们来看一个例子。

例:

var userString:String!
userString = "Hello World"
if userString != nil {
   print(userString)
} else {
   print("userString has nil value")
}

输出

Hello World

Swift可选绑定

可选绑定用于查找可选值是否包含值, 如果包含, 则使该值可用作临时常量或变量。你可以使用任何可选的绑定控制结构, 包括if let, guard let等。

让我们以一个示例来看一下if语句的可选绑定:

例:

var userString:String?
userString = "Hello world"
if let myString = userString {
   print("The value of my string is - \(myString)")
} else {
   print("My string does not have a value")
}

输出

The value of my string is - Hello world

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?