关于swift:Swift-可选Optionals类型

1次阅读

共计 1875 个字符,预计需要花费 5 分钟才能阅读完成。

Swift 的可选(Optional)类型,用于解决值缺失的状况。可选示意 ” 那儿有一个值,并且它等于 x “ 或者 ” 那儿没有值 ”。

Swfit 语言定义后缀?作为命名类型 Optional 的简写,换句话说,以下两种申明是相等的:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

在这两种状况下,变量 optionalInteger 都是可选整数类型。留神,在类型和 ?之间没有空格。

Optional 是一个含有两种状况的枚举,None 和 Some(T),用来示意可能有或可能没有值。任何类型都能够明确申明为(或者隐式转换)可选类型。当申明一个可选类型的时候,要确保用括号给 ? 操作符一个适合的范畴。例如,申明可选整数数组,应该写成 (Int[])? 写成 Int[]? 会报错。

当你申明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。

可选项遵循 LogicValue 协定,因而能够呈现在布尔环境中。在这种状况下,如果可选类型 T? 蕴含类型为 T 的任何值(也就是说它的值是 Optional.Some(T)),这个可选类型等于 true,反之为 false。

如果一个可选类型的实例蕴含一个值,你能够用后缀操作符!来拜访这个值,如下所示:

optionalInteger = 42
optionalInteger! // 42

应用操作符!去获取值为 nil 的可选变量会有运行时谬误。

你能够用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为 nil,任何操作都不会执行,也不会有运行报错。

让咱们来具体看下以下实例来理解 Swift 中可选类型的利用:

import Cocoa

var myString:String? = nil

if myString != nil {print(myString)
}else{print("字符串为 nil")
}

以上程序执行后果为:

字符串为 nil

可选类型相似于 Objective- C 中指针的 nil 值,然而 nil 只对类 (class) 有用,而可选类型对所有的类型都可用,并且更平安。


强制解析

当你确定可选类型的确蕴含值之后,你能够在可选的名字前面加一个感叹号(!)来获取值。这个感叹号示意 ” 我晓得这个可选有值,请应用它。” 这被称为可选值的强制解析(forced unwrapping)。

实例如下:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {print(myString)
}else{print("myString 值为 nil")
}

以上程序执行后果为:

Optional("Hello, Swift!")

强制解析可选值,应用感叹号(!):

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   // 强制解析
   print(myString!)
}else{print("myString 值为 nil")
}

以上程序执行后果为:

Hello, Swift!

留神:
应用 ! 来获取一个不存在的可选值会导致运行时谬误。应用 ! 来强制解析值之前,肯定要确定可选蕴含一个非 nil 的值。


主动解析

你能够在申明可选变量时应用感叹号(!)替换问号(?)。这样可选变量在应用时就不须要再加一个感叹号(!)来获取值,它会主动解析。

实例如下:

import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {print(myString)
}else{print("myString 值为 nil")
}

以上程序执行后果为:

Hello, Swift!

可选绑定

应用可选绑定(optional binding)来判断可选类型是否蕴含值,如果蕴含就把值赋给一个长期常量或者变量。可选绑定能够用在 if 和 while 语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。

像上面这样在 if 语句中写一个可选绑定:

if let constantName = someOptional {statements}

让咱们来看下一个简略的可选绑定实例:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {print("你的字符串值为 - \(yourString)")
}else{print("你的字符串没有值")
}

以上程序执行后果为:

你的字符串值为 - Hello, Swift!
正文完
 0