swift如何理解和使用optional可选类型? – Swift最新教程

上一章Swift教程请查看:swift基本数据类型

在本文中,你将了解swift的optional可选类型,以及optional使用例子和相关处理。

在前一篇文章中,我们了解了Swift中可用的不同的基本数据类型,并注意到这些类型声明的变量或常量包含一个默认值。

例子:

let someValue = Int()
print(someValue)

然而,在Swift中还有另一种数据类型可选,其默认值为空值(nil)。如果希望变量或常量中不包含值,可以使用optional,可选类型可以包含值或不包含值(空值)。

从技术上讲,你可以把它想象成一个鞋盒,鞋盒里可能有也可能没有鞋,所以,从盒子里拿鞋前你应该事先知道。

如何声明一个可选optional类型?

通过添加!或?到类型type后面,你可以简单地将数据类型表示为可选的。如果一个可选的optional类型的值包含一个值,它会返回一个可选的值<value>,否则返回nil。

例1:如何在Swift中声明一个可选optional值?

var someValue:Int?
var someAnotherValue:Int!
print(someValue)
print(someAnotherValue)

在上面的程序中,我们使用?和!这两种方法都可以创建可选的,但是有一个主要的区别,我们将在下面讨论。

声明一个可选的Int意味着该变量要么有一个整数值,要么没有值。因为没有给变量赋值,所以可以在屏幕上看到两个print语句都输出nil。

例2:从一个可选对象分配和访问一个值

let someValue:Int? = 5
print(someValue)
print(someValue!)

在上面的程序中,我们声明了一个可选的Int类型,并在其中赋值5。

如你所见,将optional类型的值打印为print(someValue),而不会得到5,而是Optional(5)。它的形式如上所述:Optional<Value>,为了从它访问<Value>,我们需要一种称为解包装的机制。

你可以通过附加来打开一个可选的!字符位于变量/常量的末尾,如下一行所示(someValue!),print(someValue!)在屏幕上打开可选的输出5。

但是请记住,这种展开机制应该只在确定可选项在访问时肯定有一个值时才使用。

示例3:显式地声明一个解包装的可选类型

你也可以创建一个解包装可选类型为:

let someValue:Int! = 5
print(someValue)

在上面的程序中,Int!创建一个解包装可选类型,它会在你访问它时自动地打开该值,这样你就不必每次都附加!的特性。

当你使用这些可选类型时,一定要确保变量在你访问它时总是需要有一个值。如果不这样做,你将得到一个致命的错误崩溃。

示例4:访问空解保证可选类型时发生致命错误

var someValue:Int!
var unwrappedValue:Int = someValue // 致命错误

当你运行该程序时,你将得到一个崩溃为致命错误:(unexpectedly
found nil while unwrapping an Optional value
)在展开一个可选值时意外发现nil,因为代码unwrappedValue:Int = someValue试图将值从可选的someValue赋给变量unwrappedValue。

但是,somevalue是一个可选类型,它包含空值,试图将空值赋给非可选变量unwrappedValue将导致崩溃。

下面将介绍处理这种情况的不同技术。

可选optional类型的处理

为了使用可选的值,需要打开它,使用可选值的更好方法是使用条件展开,而不是使用强制展开!操作符。

这是因为有条件地展开询问是否该变量有值?,如果是,则给出值,否则它将处理nil情况。

相反,强制展开表示此变量在你使用时确实有一个值。因此,当强制打开一个为nil的变量时,程序将抛出一个意外发现的nil,同时打开一个可选异常并崩溃。下面介绍一些条件展开的技术:

if语句

你可以使用if语句,并将optional与nil进行比较,以确定optional是否包含值。可以在if语句中使用比较运算符“等于”运算符(==)或“不等于”运算符(!=)。

例5:可选类型和if
else语句处理

var someValue:Int?
var someAnotherValue:Int! = 0
        
if someValue != nil {
    print("value: \(someValue!)")
} else {
    print("no value")
}
        
if someAnotherValue != nil {
    print("value: \(someAnotherValue!)")
} else {
    print("no value")
}

在上面的程序中,如果一个可选的语句包含一个值,则执行if语句中的代码,否则执行else块中的语句。使用此技术的可选处理的主要缺点是,你仍然需要从可选使用中打开值!操作符。

可选optional绑定(if-let)

可选绑定帮助你查明可选的值是否包含值。如果一个可选的值包含一个值,该值可以作为临时常量或变量使用。因此,可选绑定可以与if语句一起使用,以检查可选语句中的值,并将该值提取到单个操作中的常量或变量中。

例5:使用if let语句的进行可选optional处理

var someValue:Int?
var someAnotherValue:Int! = 0
       
if let temp = someValue {
    print("value \(temp)") 
} else {
    print("no value")
}
        
if let temp = someAnotherValue {
    print("value \(temp)")
} else {
    print("no value")      
}

在上面的程序中,如果可选项包含一个值,if语句中的代码就会执行,否则,else块将被执行。if-let语句也会自动打开这个值,并将打开的值放在temp常量中。这种技术有很大的优势,因为你不需要强制打开值,尽管可以确定一个可选的包含一个值。

Guard语句

你可以使用guard语句处理可选类型,如果你不知道什么是guard,也不用担心。现在,只需将guard看作一个没有if块的if-else条件语句即可,如果条件失败,则执行else语句,如果不是,则执行下一个语句。

示例6:使用guard的处理可选optional类型

func testFunction() {
    let someValue:Int? = 5
    guard let temp = someValue else {
        return
    }
    print("value: \(temp)")
}
testFunction()

在上面的程序中,无论可选的someValue是否包含值,guard都包含一个条件。如果它包含一个值,那么guard-let语句将自动打开该值,并将打开的值放在temp常量中。否则,else块会被执行,它会返回到调用函数。因为可选的包含一个值,所以调用print函数。

空合操作符(nil-coalescing)

在Swift中,你也可以使用nil-coalescing操作符来检查一个可选的值是否包含一个值。定义为(a
??b).它打开一个可选的a并返回它,如果它包含一个值,或者返回一个默认值b,如果a是nil。

示例7:使用nil-coalescing操作符的可选处理

var someValue:Int!
let defaultValue = 5
let unwrappedValue:Int = someValue ?? defaultValue
print(unwrappedValue)

在上面的程序中,变量someValue被定义为可选的,并且包含空值。nil合并操作符无法打开可选项,因此返回defaultValue,因此,语句print(unwrappedValue)在控制台中输出5。

var someValue:Int? = 10
let defaultValue = 5
let unwrappedValue:Int = someValue ?? defaultValue
print(unwrappedValue)

但是,在上面的程序中,可选变量someValue是用值10初始化的,因此,nil合并操作符成功地将值从someValue中释放出来,因而someValue ?? defaultValue返回10,语句print(unwrappedValue)在控制台中输出10。

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