Swift:可选类型(Optional)

在我们使用objective-c表示字符串信息的时候,可以用下面方法书写。

NSString *str = @"秋恨雪";
str = nil;

因为objective-c是弱类型语言,所以这里的str既可以是具体的字符串也可以是nil。但到了Swift中就不可以了,因为Swift是类型安全的语言,一个String类型的变量不可能既能是具体的字符串,又可以为nil(更严格的说String类型的内容只能是字符串)。所以,在Swift中有了可选类型的概念。(其实这一概念也是“借鉴”于其他编程语言,比如C#,只不过在C#中称之为可空类型)

一、可选类型的定义

可选类型的格式: 类型名?

例如:

var phone: String?

问号 "?" 表明phone 的值是可选的,可能是一个String,也可能不存在。

phone的值要么是String类型,要么是nil。

二、可选类型的应用

String有一个toInt方法,可以将字符串转为对应的整数。

有些字符串能转成整数: 比如 "123", 可以转成 123。

有些字符串不能转成整数, 比如 "秋恨雪", 无法转成整数。

因此toInt方法的返回值是一个可选的Int类型(即 Int?)

所以转换结果如下:

let num = "123".toInt()      // 123
let num2 = "秋恨雪".toInt()   // nil

注意: num和num2 都是 Int? 类型,而不是 Int类型。

三、可选类型的本质

Int? 其实是对Int的一层包装,它们是两种不同的数据类型。

var num: Int? = 10

可以理解为num包含了 "Some" 和 "None" 这两个 "属性",而上面的操作只是将Int类型的10,包装到了Int? 中的 "Some" 中。示意图如下:

四、强制解包(拆包)

在可选类型的后面加个感叹号 "!" , 就可以将可选类型(包装)的值取出来,赋值给具体类型。

比如下面的写法:

var num: Int? = 10
var numValue: Int = num!

其实就是将 "Some" 中的值取出来。示意图如下:

注意:如果可选类型(包装)的值不存在,即 "Some" 的值不存在,任然进行强制解包,会报错。

var num: Int?
var numValue: Int = num!

错误信息:fatal error: unexpectedly found nil while unwrapping an Optional value.

因此,在强制解包之前,一定要先检查可选类型(包装)的值是否存在。

针对上面的情况,我们可以使用if语句来检测一个可选类型(包装)的值是否存在。例如:

if let num = "156".toInt() {
    println("num的值是\(num)")
} else {
    println("num的值不存在")
}

五、隐式解包(拆包)

默认情况下,如果想将可选类型(包装)的值赋给具体类型,比如将Int?的值赋给Int类型,需要使用感叹号 "!"

如果将可选类型声明为隐式解包。

1. 不用再进行强制解包。

2. 能够自动解包:自动把可选类型(包装)的值取出来赋给具体类型。

隐式解包的声明只需将 "?" 改为 "!" 即可。例如:

var num: Int! = 20
var numValue: Int = num // 自动解包

隐式解包的原理:

1. 相当于告诉编译器,这个可选类型的值一直都存在,绝对能取出里面的值。

2. 取值时不用手动加感叹号 "!", 编译器会自动加上一个感叹号 "!" 。

六、"?" 和 "!" 使用场景

1. 在Swift中闭包(如有疑问,请参照我上一章节《Swift:闭包(Closures)》)已经取代了block,定义一个闭包:

var testClosure: ((str1: String) -> Void)?

可以看出,这个闭包的类型后面有一个问号 "?", 因为这个闭包属性很有可能为nil。

2. 在Swift中的IBOutlet的连线操作,就表明了这个控件是一定存在的。例如:

@IBOutlet weak var testLabel: UILabel!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 16:20:29

Swift:可选类型(Optional)的相关文章

Swift 可选类型(补充)

// 可选类型 // 可选类型: 这个值要么存在等于X,要么这个值根本就不存在 var serverResponseCode : Int? = 404 // ?的意思是这个只存在为404,要么这个值就不存在为nil let possbileNumber = "123" // let coverNumber: Int? = possbileNumber.toInt() var responseCode: Int? = 404 // 要么存在为404 responseCode = nil 

[swift]可选类型

可选类型 <Swift权威指南>第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍.尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Swift程序都必不可少的.所以,读者通过对本章学习,可以使用Swift编写最基本的程序,并对Swift提供的新特性深深地震撼.本节为大家介绍可选类型. AD: 2.6  可选类型 可选类型也是Swift语言新添加的对象.主要是为了解决对象变量或常量为空的情况.在前面定义的变量和常量都不能为空.里面必须要有值.

Swift 可选类型-备

我们先看看如下代码:   var n1: Int = 10 n1 = nil         //编译错误 let str: String = nil    //编译错误 Int和String类型不能接受nil的,但程序运行过程中有时被复制给nil是在所难免的,Swift为每一种数据类型提供一种可选类型(optional),即在某个数据类型后面加上问号(?)或感叹号(!),修改前文示例代码:   var n1: Int? = 10 n1 = nil let str: String! = nil

Swift可选类型和可选链

一.可选类型 有时候在Swift程序的表达式可以看到?和!等符号,它们代表的含义是什么,这些符号都和可选类型有关. 有时候使用一个变量和常量,它保存的值可能有也可能没有 1.比较给一个变量赋值nil,需要下面的表达式赋值 class Empoyee{ var  int : = 0 var name:String = "" var job : String ="" } var emp : Employee? = nil //后面加上?号可以接受空值,不加?不能赋予空值

swift可选类型_09_optional基本使用

//: Playground - noun: a place where people can play import UIKit //1.Swift中的变量或者常量必须经过初始化或者赋值后才能使用 var myInt:Int myInt = 1 print(myInt) //2.使用可选类型来处理一个常量或者变量的值可能缺失的情况 let correctStr = "123" var correctInt = Int(correctStr) let wrongStr = "

Swift - 可选类型说明

可选类型是Swift的一个特色.它表示一个变量有可能有值,也可能没有值(nil). 声明的方式是“数据类型+问号”. 而当要使用一个可选类型的变量是,要在后面加感叹号“!”. 1 2 3 4 5 6 7 8 9 var height:Int?  //声明一个可选类型,默认值为nil if height == nill{     println("你有多高?") }else{     println("你有\(height!)高.") } height = 199 /

Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)

本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: C代码   var stringValue : String //error: variable 'stringValue' used before being initialized //let hashValue = stringVa

swift 可选类型(optional)--- swift 入门

一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print("x或y有一个为空") //1 使用?? let name:String? = "我最帅" let age:Int = 18 //??代表可选型解包 //下面两个执行结果由于值的变化而表现的不一样, print(name ?? "" + String(a

Swift入门(四)——可选类型(Optionals)与断言(Assert)

可选类型是什么? 首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量. var stringValue = "5" var intValue = stringValue.toInt(); println("intvalue = \(intValue)") 执行以上方法后得到了奇怪的结果: intvalue = Optional(5) 其实,可以发现,toInt方法的返回值并不是Int,而是In