Swift - 可选值(Optionals)



Swift 引入了一种名为可选类型的新特性。可选类型处理可能不存在或未定义的值。它允许变量表示一个值或 nil。可选值类似于在 Objective-C 中使用 nil 指针,但它们适用于任何类型,而不仅仅是类。要指定可选类型,必须在类型名称后使用问号 (?)。

语法

以下是可选变量的语法:

var perhapsInt: Int?

示例

Swift 程序演示如何创建可选变量。

// Declaring an optional Integer
var number: Int?

// Assigning a value to the optional
number = 34

// Using optional binding to safely unwrap its value
if let x = number {
   print("Value is \(x)!")
} else {
   print("Value is unknown")
}

输出

Value is 34!

带有 nil 的可选值

如果要将可选变量指定为无值状态或没有值,则可以为该变量赋值 **nil**。或者,如果未为可选变量赋值,则 Swift 会自动将该变量的值设置为 nil。在 Swift 中,只允许将 nil 赋值给可选变量,如果尝试将 nil 赋值给非可选变量或常量,则会报错。

语法

以下是将可选值赋值为 nil 的语法:

var perhapsStr: Int?  = nil

示例

Swift 程序演示如何将 nil 赋值给可选变量。

// Optional variable
var num: Int? = 42

// Setting variable to nil 
num = nil

// Check if the optional has a value or not
if num != nil {
   print("Optional has a value: \(num!)")
} else {
   print("Optional is nil.")
}

输出

Optional is nil.

强制展开

如果将变量定义为 **可选** 类型,则要获取此变量的值,必须对其进行展开。因此,要 **展开** 值,必须在变量末尾添加感叹号 (!) 。这告诉编译器您确定可选值包含某个值。

语法

以下是强制展开的语法:

let variableName = optionalValue!

示例

Swift 程序演示如何展开可选值。

// Declaring an optional Integer
var number: Int?

// Assigning a value to the optional
number = 34

// Using exclamation mark (!) to forcefully unwrapping the optional
let value: Int = number!

// Displaying the unwrapped value
print(value)

输出

34

隐式展开可选值

可以使用感叹号 (!) 而不是问号 (?) 来声明可选变量。此类可选变量将自动展开,无需在变量末尾使用任何其他感叹号 (!) 来获取已赋值的值。

示例

import Cocoa

var myString:String!
myString = "Hello, Swift 4!"

if myString != nil {
   print(myString)
}else{
   print("myString has nil value")
}

输出

Hello, Swift 4!

可选绑定

使用可选绑定来确定可选值是否包含值,如果包含,则将其值作为临时常量或变量使用。或者可以说,可选绑定允许我们展开和使用可选值中存在的值。它可以防止我们展开 nil 值并导致运行时崩溃。

可以使用 if let、guard 和 while 语句执行可选绑定。允许在一个 if 语句中使用多个可选绑定和布尔条件,用逗号分隔。如果给定的多个可选绑定和布尔条件中的任何一个为 nil,则整个 if 语句都被认为是 false。

语法

以下是可选绑定的语法:

if let constantName = someOptional, let variableName = someOptional {
   statements
}

示例

// Declaring an optional Integer
var number: Int?

// Assigning a value to the optional
number = 50

// Using optional binding to safely unwrap the optional
if let x = number {
   print("Number is \(x)!")
} else {
   print("Number is unknown")
}

输出

Number is 50!

空合并运算符 (??)

在 Swift 中,还可以使用空合并运算符 (??) 来处理缺失值,并在可选值为 nil 时提供默认值。它是使用可选绑定和默认值的简写方法。

语法

以下是空合并运算符的语法:

Let output = optionalValue ?? defaultValue

空合并运算符 (??) 检查左侧操作数的值是否不为 nil。如果它不为 nil,则展开该值。如果该值为 nil,则它将提供右侧操作数中的值(或作为备用值)。

示例

// Function to fetch employee salary
func getEmpSalary() -> Int? {

   // Return nil when salary is not available
   return nil
}

// Using the nil-coalescing operator to provide a valid salary
let salary = getEmpSalary() ?? 5000 

// Displaying the result
print("Salary: \(salary)")

输出

Salary: 5000
广告