简介
通过构造函数为Int类型的变量count赋一个初始值
var count: Int = Int("42")
此时count的初始值就是42
var numb: Int = Int("hello")
此时通过构造函数无法构造出一个Int类型的数字,程序会报错,number在这时是无值的。OC中程序会在这种情况下为number默认赋值为0,这样并不能严格区分出这个变量是否有值。
-
Optional type
Optional type是一个有两个case的枚举,Optional.none相当于nil,Optional.some(Wrapped) 存储着一个包装过的值
在swift中我们可以定义Optional类型的实例,Optional实例的值的类型即为Optional type。这样就可以严格区分出这个变量是否有值,也可以初始化一个无值的实例。
使用
两种使用Optional type的方法
let shortForm: Int? = Int("42") //在类型的后面加上?
let longForm: Optional<Int> = Int("42")
解包装
optional类型实例存储的內容是被包装起來的,我们需要解开包装,才能读取它的內容。
- Optional Binding:如果要按条件将包装值赋给新的实例,可以使用if let, guard let,或switch解包
var str: String?
if let strName = str {
print("test" + strName)
} else {
print("没有值")
}
// Prints "没有值"
这个过程相当于:1.判断optional变量(常量)是否有值 2.如果有值,使用!取值
- Optional Chaining:如果要安全的访问Optional类型实例的属性或方法,可以使用操作运算符(postfix)
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
print("The star image is in PNG format")
}
- Using the Nil-Coalescing Operator(设置默认值):使用?? 如果Optional实例为nil,则为其设置一个默认值
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"
??还可以同时为多个Optional实例设置默认值
let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
- Unconditional Unwrapping:当你确定某个Optional实例拥有一个确定的值时,可以使用!强制解开包装读取内容。
let number2 = Int("42")!
print(number2)
// Prints "42"
当optional常量/变量没有任何东西时,读取到的即为nil,这是有一定风险的。
这里也可以使用操作运算符(postfix)
let isPNG = imagePaths["star"]!.hasSuffix(".png")
print(isPNG)
// Prints "true"
- Implicitly Unwrapped Optioal(自动解包):定义Optional变量或常量时,在类型后加上!(不再是加?),则在使用时可以直接取值(不用再加!强制解开包装读取内容)。如果我们可以确定一旦变量或者常量被创建并初始化后,一直都会有值,那么就可以使用隐式拆包方式获取值。
var str2: String! = "str2"
//不需要使用!,直接解包
let str2Name :String = str2
如果尝试访问的自动解包可选值不包含值,会触发运行时错误。我们依然可以想使用正常的Optional一样,使用if或者while 判断自动解包可选值是否包含值
var str2: String! = nil
//不需要使用!,直接解包
if (str2 != nil) {
print(str2)
}
注意事项
- 在swift中非optional类型常量和变量是不能设置为nil的,这与OC用的nil不同。
- swift中的nil不同与OC中的nil,在OC中,nil表示不存在的对象。在Swit中,nil不是指针,只是表示某种类型的值不存在,
- optional可以设置任何类型值为nil,不仅仅是对象类型。如果在代码中不确定这个变量或者常量是否有值,那么就声明为optional。
以上是自己在学习Optional过程中的记录和总结,如有不足,还望指教。
参考:
网友评论