本篇文章主要介绍的是swift代码中基础的相对与其余语言的一些特性和优秀的地方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
复制代码
以上的代码能够理解成以下的图: app
若是要从可选项中取出数据就叫作解包,须要用感叹号!来强制解包
复制代码
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 同样。ui
可使用可选项绑定来判断可选项是否包含值
若是包含就自动解包而且把值赋值给一个临时常量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
复制代码
等价于:spa
if let number = Int("4"),
let count = Int("32"),
number < count && count < 100{
print("\(number) <\(count) < 100")
}
// 4<32<100
复制代码
a??b
复制代码
注意:3d
1. a是可选项
2. b是可选或者是不可选项
3. 若是a不为nil,就返回a,若是a为nil,就返回b
4. 若是b不是可选项,返回a时候会自动解包
复制代码
内置函数看一下:code
举个🌰:cdn
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是可选项,也就是结果也是可选项,就能够用可选项绑定处理blog
当之后若是变量中可能有nil的状况下,能够用这种组合拳去处理问题
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
复制代码
? 要改为!,先要进行强制解包