swift中可选值中可选值?和和!使用的方法示例使用的方法示例
主要给大家介绍了关于swift中可选值?和!使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作
具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
Optional 可选值可选值
Optional是 Swift 的一大特色,也是 Swift 初学者最容易困惑的问题。
定义变量时,如果指定该变量是可选的,表示该变量可以有一个指定类型的值,也可以是 nil。
此外,Swift的nil也和Objective-C有些不一样,在Objective-C中,只有对象才能为nil,而在Swift里,当基础类型(整形、浮点、布尔
等)没有值时,也是nil,而不是一个初始值,没有初始值的值,是不能使用的,这就产生了Optional类型。定义一个Optional的值很容
易,只需要在类型后面加上问号(?)就行了,如:
var str: String?
一个Optional值和非Optional值的区别就在于:Optional值未经初始化虽然为nil,但普通变量连nil都没有:
//未被初始化,但是是一个Optional类型,为nil
var str: String?
str //输出nil
//未被初始化,也不是Optional类型
var str2: String
str2 //使用时出错
关于可选值关于可选值 !和!和 ?? 使用使用
先来看一个栗子
class House {
//房子有几个房间
var numRooms:Int = 5
}
class Person {
//一个人可能有房子也可能没有房子,所以将房子的属性设为可选
var house: House?
}
let xiaowang = Person()
//此时xiaowang没有房子
//如果试图调用xiaowang的house属性,访问house的numRooms属性。过程如下:
//1. 第一种方式: 将house强行解包,用 !。但此时 house 没有值,所以结果是直接崩溃的。
let numroom = xiaowang.house!.numRooms
//2. 用 if let
if let house = xiaowang.house {
let roomCount = house.numRooms
}
//3. 用 ?
if let numRooms = xiaowang.house?.numRooms {
let numroom = numRooms
}
现在问题来了现在问题来了
1. house后面怎么可以直接接问号呢?不是接了问号编译器就知道它是否有值会报错吗?
2. house的numRooms属性不是必选属性吗? 为什么用if let来做可选绑定了呢?
这个涉及到一个新的知识,叫可空链式调用。
可空链式调用。是指当调用可选一个对象的属性或方法时,可以直接使用问号,此时,不管它的属性是否可选。最终都返回一个该可
选值。
可空链式调用可空链式调用
可空链式调用。是指当调用一个 可选对象 的属性和方法时。可以先不对该可选对象强行解包。直接使用?此时 可选 这个特征,一直
往后传递到 最后要调用的属性和方法,最后返回一个可选的值的过程。
还举上面的例子。
if let numRooms = xiaowang.house?.numRooms {
let numroom = numRooms
}
此时调用的是可选对象 house 的 numRooms属性。满足条件:
house是可选对象
评论0
最新资源