本篇文章主要介绍的是swift代码中基础的相对与其他语言的一些特性和优秀的地方
可选项
## 定义 一般也叫可选类型,它是允许将值设置为nil的,表示方式就是在类型的后面加上? 来定义可选项
var a:Int? var b:Int
var a:Int? = nil var b:Int = 0
左边的是等价的,右边就不一样了 举个🌰:
强制解包
可选项是对其他类型的一层包装,可以将它理解成一个盒子,如果为nil,表示是个空盒子,如果不为nil,表示盒子里面有被包装的数据
var age:Int?
age = 10
age = nil
以上的代码可以理解成如下的图:
如果要从可选项中取出数据就叫做解包,需要用感叹号!来强制解包
var age:Int? = 10
var num = age + 11
同学们看下,上面的代码有什么问题吗?自己可以尝试在pg里面尝试写一下,它会报错:
Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
这里就是说:你要用age来加上11 赋值给 变量num,但是num并不知道你里面有没有值,可选项可能会nil,所以要强制解包!
var age:Int? = 10
var num = age! + 11
我们这个时候不妨打印下age:发现还是optional(10),所以说强制解包只是把盒子里面值拿出来用一下,不能改变它
如果对值为nil,也就是空盒子强制解包,就会出现运行时错误
判断可选项是否包含值
var num = Int("xixi123")
Int 进行强制解包这么个东西,到底是返回啥呢,给0 行不行?当然不行! 因为你可能Int里面的可能就是“0”,-1 一样。
可选项绑定
可以使用可选项绑定来判断可选项是否包含值
如果包含就自动解包并且把值赋值给一个临时常量let或者变量var,并返回true/false
if let num = Int("123") {
print("字符串转整数成功\(num)")
}else{
print("字符串转整数失败!")
}
这里自动解包成功以后,获取到num是值123,不是optional,因此不需要加!
等价写法
if let number = Int("4") {
if let count = Int("32"){
if number < count && count < 100{
print("\(number) <\(count) < 100")
}
}
}
// 4<32<100
等价于:
if let number = Int("4"),
let count = Int("32"),
number < count && count < 100{
print("\(number) <\(count) < 100")
}
// 4<32<100
空合并运算符??
a??b
注意:
1. a是可选项
2. b是可选或者是不可选项
3. 如果a不为nil,就返回a,如果a为nil,就返回b
4. 如果b不是可选项,返回a时候会自动解包
内置函数看一下:
举个🌰:
??跟if let 配合使用
let a:Int? = nil
let b:Int? = 12
if let c = a ?? b{
print(c)
}
// 类似 if a!=nil || b!=nil
if let c = a, d = b{
print(c)
print(d)
}
// 类似 if a!=nil && b!=nil
上面代码,先看a??b,b是可选项,也就是结果也是可选项,就可以用可选项绑定处理
当以后如果变量中可能有nil的情况下,可以用这种组合拳去处理问题
guard语句
guard 条件 else {
// do something...
退出当前作用域
//return,break,continue,throw error
}
当guard 条件为false的时候才执行大括号里面的语句, 当guard 条件为true的时候就会跳出guard语句, guard 语句特别适合提前退出 当使用guard语句进行可选项绑定时,绑定的常量let,变量var 也能在外层作用域内使用
func login(_ info:[String:String]){
guard let username = info["username"] else{
print("请输入用户名")
return
}
guard let password = info["password"] else{
print("请输入密码")
return
}
}
隐式解包
let num11 : Int? = 10
let num22 : Int = num11
在某种情况下,可选项一旦被设定了值,就会一直拥有它,不必要每次访问都去进行解包,因为它每次访问都有值,这种可选值赋值是需要解绑
let num11 : Int! = 10
let num22 : Int = num11
? 要改成!,先要进行强制解包