swift中的nil和objective-c里的有些不一样,在objective-c中只有对象才能为nil而在swift中基础类型(整型、浮点、布尔等)没有值时也是nil,而不是一个初始值,没有初始值的值是不能用的,这就产生了optional类型。定义一个optional的值很容易,只需要在类型后面加上?就行了,如:
var str: String?
可选类型Optional:用于等于某个值或者值不存在的情况
let 昨天我买的彩票 = “50”
let 中奖金额 = 昨天我买的彩票.toInt()
if 中奖金额 {
println(“恭喜,中了(中奖金额)元!”)
} //输出 恭喜,中了Optional(50)元!
/这里中奖金额是一个Optional类型,用println字符串插值会把类型也显示出来。需要用到拆包:在Optional类型后面加!,把Optional的值取出来,前提是Optional类型有值。/
//若Optional没有值,使用会报错
let 昨天我买的彩票 = “谢谢惠顾”
let 中奖金额 = 昨天我买的彩票.toInt()
if 中奖金额 {
println(“恭喜,中了(中奖金额!)元!”)
} else {
println(“下次再来”)
}
Optional Binding:拆包的时候把值保存下来
let 昨天我买的彩票 = “5000000”
let 中奖金额 = 昨天我买的彩票.toInt()
if var 临时金额 = 中奖金额 {
var 税后金额 = (Double)临时金额 * 0.8 //这里0.8是Double类型
println(“恭喜你中了(临时金额)元,税后(税后金额)元”)
} else {
println(“下次加油!”)
}
Optional类型之所以要拆包使用,是因为Optional类型其实的一个枚举。当Optional没有值的时候,返回的nil其实就是Optional.None,即没有值。除了None以外,还有一个Some,当有值的时候就是被Some包装的真正值,所以拆包的过程就是将Some里面的值取出来。
enum Optional : Reflectable,NilLiteralConvertible {
case None
case Some(T)
init()
init(_ some: T)
/// Haskell’s fmap,which was mis-named
func map(f: (T) -> U) -> U?
func getMirror() -> MirrorType
static func convertFromNilLiteral() -> T?
}
显式拆包(直接拆
包):
var str: String? = “HELLO”
str //Some “HELLO”
str! //HELLO
隐式拆包(间接拆包)—用于optional一直有值的情况:
var str: String! = “HELLO”
str //HELLO
可以看到没有使用(?)进行显式的折包也得到了Some中的值,这个语法相当于告诉编译器:在我们使用Optional值前,这个Optional值就会被初始化,并且总是会有值,所以当我们使用时,编译器就帮我做了一次拆包。如果你确信你的变量能保证被正确初始化,那就可以这么做,否则还是不要尝试为好。
Assertions断言—一般用于限制底线条件
var 年龄 = 0
assert(年龄>18,”必须年满18岁方可继续玩本游戏”)
一般用于下面3种情况:
1.整型下标的索引传递给一个自定义的下标进行实现,下标的索引有可能过大或者过小
2.一个值传递给一个函数,但对函数来讲,这个值是无效的
3.一个optional必须要有一个非nil的值才能继续后面的程序
断言会导致程序立即终止,断言一般用于调试程序,用来调试一些程序运行所设置的底线条件。比如年满18岁才能玩的游戏,18岁就是底线条件。
3种操作符 一元操作符:一次操作一个对象 二元操作符:2个对象 三元操作符:唯一的三元操作符 (a?b:c) // a为真就执行b,否则执行c