//可选项,一般也叫可选类型,它允许将值设置为nil。
var nameValue:String = "Jack"
//nameValue = nil// error: 'nil' cannot be assigned to type 'String'
//在类型名称后面加个?来定义一个可选项。
var nickValue:String? = "Mary"
nickValue = nilvar ageValue:Int?//不设置可选项默认没有值、设置可选项默认值nil//事例
var array = [10,15,20,25]func indexFunc(_ item:Int) -> Int?{if item < 0 || item > array.count {return nil}return array[item]
}
/*
print(indexFunc(0))//Optional(10)
print(indexFunc(-1))//nil
print(indexFunc(10))//nil
*/
//可选项是对其他类型的一种包装。如果从可选项中取出被包装的数据,需要使用感叹号(!)进行强制解包。
var heightValue:Int? = 10
var height = heightValue! + 20
print(height)//30//如果对值为nil可选项进行强制解包、会报错。
var widthValue:Float?
//错误演示 error: Unexpectedly found nil while unwrapping an Optional value
//var width = widthValue! + 5.0//判断可选项是否包含值。
var numberInt = Int("123")
if numberInt != nil {//按着 option键看:var numberInt: Int?print("转换成功:\(numberInt!)")
}else{print("转换失败!")
}
//可以使用可选项绑定来判断可选项是否包含值,如果包含就自动解包,把值赋给一个临时常量(let)或者变量(var)并且返回true或false.
if let numberInt = Int("123") {//numberInt是强制解包后的值。//numberInt作用域{}内。print("转换成功:\(numberInt)")
}else{print("转换失败!")
}//等价写法
if let first = Int("4"){if let second = Int("42"){if first < second && second < 100{print("\(first) < \(second) < 100")}}
}if let first = Int("4"),let second = Int("42"), first < second && second < 100{print("\(first) < \(second) < 100")
}//while循环中使用可选项绑定。
//遍历数组,将遇到的证书都加起来,如果遇到负数或者非数字停止遍历。
var numberArrays = ["10","4","2","5","-4","5"]var arrayIndex = 0
var arraySumValue = 0while let itemValue = Int(numberArrays[arrayIndex]),itemValue > 0 {arraySumValue += itemValuearrayIndex += 1
}print(arraySumValue)//21
//空合并运算符: ??。规则:符号左边必须是可选项,符号右边可以是可选项也可以不是可选项。符号两侧的存储类型必选相同。如果符号左侧不为nil就返回左侧值,否则返回右侧值。如果右侧不是可选项返回左侧强制解包。let a:Int? = 1
let b:Int? = 2
let c = a ?? b //c 是可选项类型:Optional(1)let i:Int? = nil
let j:Int? = 2
let k = i ?? j //k 是可选项类型:Optional(2)let q:Int? = nil
let w:Int? = nil
let e = q ?? w //e 是可选项类型:nillet r:Int? = 1
let t:Int = 2
let u = r ?? t //u 因为 r不为nil且t不是可选项,所以u为r强制解包值 Int类型 1.//??和 if let 的使用let value1:Int? = nil
let value2:Int? = 2
if let num = value1 ?? value2 {print(num)
}
/*1、当guard语句的条件为false时,就执行大括号里面的代码。2、当guard语句的条件为true时,就会跳过guard语句。3、guard语句特别适合用来提前退出。4、当使用guard语句进行可选项绑定时,绑定的常量(let)、变量(var)也能在外层作用于使用。*/func loginFunc(_ info:[String:String]) {guard let userNmae = info["username"] else {print("请输入用户名")return}guard let passWord = info["password"] else {print("请输入密码")return}print("用户名:\(userNmae)、密码:\(passWord)")
}
/**1、在某些情况下,可选项一旦被设定值之后、就会一直拥有值。在这种情况下、可以去掉检查、也不必每次访问的时候都进行解包、因为它能去定每次访问的时候都有值。2、可选项类型加个感叹号!定义一个隐式解包的可选项。*/let numberImp1:Int! = 10
let numberImp2:Int = numberImp1
if numberImp1 != nil{print(numberImp1 + 6)
}//16if let numberImp3 = numberImp1{print(numberImp3)
}//10
//可选项在字符串插值或者直接打印时,编译器会发出警告。
var intImp:Int? = 10
print("intImp is \(intImp)")
//消除警告方式
print("intImp is \(intImp!)")
print("intImp is \(String(describing:intImp))")
print("intImp is \(intImp ?? 0)")