美文网首页
Swift - Optionals

Swift - Optionals

作者: 红鲤鱼绿鲤鱼与鱼 | 来源:发表于2017-06-15 15:14 被阅读40次

简介

通过构造函数为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类型实例存储的內容是被包装起來的,我们需要解开包装,才能读取它的內容。

  1. Optional Binding:如果要按条件将包装值赋给新的实例,可以使用if let, guard let,或switch解包
var str: String?
if let strName = str {
    print("test" + strName)
} else {
    print("没有值")
}
// Prints "没有值"

这个过程相当于:1.判断optional变量(常量)是否有值 2.如果有值,使用!取值

  1. 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")
}
  1. 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"
  1. Unconditional Unwrapping:当你确定某个Optional实例拥有一个确定的值时,可以使用!强制解开包装读取内容。
let number2 = Int("42")!
print(number2)
// Prints "42"

当optional常量/变量没有任何东西时,读取到的即为nil,这是有一定风险的。



这里也可以使用操作运算符(postfix)

let isPNG = imagePaths["star"]!.hasSuffix(".png")
print(isPNG)
// Prints "true"
  1. Implicitly Unwrapped Optioal(自动解包):定义Optional变量或常量时,在类型后加上!(不再是加?),则在使用时可以直接取值(不用再加!强制解开包装读取内容)。如果我们可以确定一旦变量或者常量被创建并初始化后,一直都会有值,那么就可以使用隐式拆包方式获取值。
var str2: String! = "str2"
//不需要使用!,直接解包
let str2Name :String = str2

如果尝试访问的自动解包可选值不包含值,会触发运行时错误。我们依然可以想使用正常的Optional一样,使用if或者while 判断自动解包可选值是否包含值

var str2: String! = nil
//不需要使用!,直接解包
if (str2 != nil) {
    print(str2)
}

注意事项

  1. 在swift中非optional类型常量和变量是不能设置为nil的,这与OC用的nil不同。
  2. swift中的nil不同与OC中的nil,在OC中,nil表示不存在的对象。在Swit中,nil不是指针,只是表示某种类型的值不存在,
  3. optional可以设置任何类型值为nil,不仅仅是对象类型。如果在代码中不确定这个变量或者常量是否有值,那么就声明为optional。

以上是自己在学习Optional过程中的记录和总结,如有不足,还望指教。

参考:

  1. https://developer.apple.com/documentation/swift/optional
  2. Swift的問號與驚嘆號:可有可無的 Optional
  3. http://blog.csdn.net/woaifen3344/article/details/29364743

相关文章

网友评论

      本文标题:Swift - Optionals

      本文链接:https://www.haomeiwen.com/subject/qbfeqxtx.html