// 类型后面加上?(不能有空格)代表可能是这个类型,可能什么都不是,但绝对不会是别的类型
var x:Int? //代表x可能是一个int类型,也可能什么都不是,但是绝对不会是其他类型
//在一个可选类型变量后面加上!(不能有空格),代表确定这个变量有值,可以直接读取,但是如果这个变量没有值,就会crash
//因此对于可选值,一定要先用if判断是有值,再用!读取
func divide(a:Int,b:Int)->Double?{ //这个函数可能返回一个double,也可能是nil,所以返回值要加上一个?
if b==0 {
return nil
}
return Double(a)/Double(b)
}
let result:Double?=divide(0, 1) //读取函数的返回值也要用可选类型
var res:Bool=true
var re:Double=0
if result{
re=result! //此处必须用!读取
}else{
println("error")
}
//普遍使用判断方法如下
if let result=divide(3, 0){ //这里的let result可能是一个nil也可能是一个double,但都会确定数据类型
re=result //这行就不用!来读取数据
}else{
println("error")
re=0
}
// 对于带有?的数据类型,什么时候加!什么时候不加,当单独使用的时候可以不加!,但是如果要与其他数据进行运算操作,一定要加!,否则编译器无法知道这个数据会返回什么类型,不能计算
//可选链
class Emplyee{
var no:Int=0
var name:String=""
var job:String?
var salary:Double=0.0
var dept:Department?
}
struct Department{
var no:Int=0
var name:String=""
}
var emp=Emplyee()
var deptName=emp.dept?.name //此处的问号为可选链,一旦emp.dept是nil,可以返回nil,如果使用!而又为nil会crash