美文网首页Swift
swift 可选类型(optional)

swift 可选类型(optional)

作者: 西风那个吹呀吹 | 来源:发表于2017-05-16 19:14 被阅读95次

    可选类型定义

    Swift 标准库中定义后缀  ?为可选类型 Optional<Wrapped> 的语法糖,这里语法糖可以简单理解为一种便捷的书写语法。也就是说,下面两个声明是等价的:

    var name: Optional<String>

    var name: String?

    上述两种情况,变量 name 被声明为可选字符串类型。

    我们可以在xcode编译器中,按住 command 键 同时点击 OPtional,可以跟进去查看可选类型的具体实现:

    public enum Optional: ExpressibleByNilLiteral {

                /// The absence of a value.

                /// In code, the absence of a value is typically written using the `nil`

                /// literal rather than the explicit `.none` enumeration case.

                case none

                /// The presence of a value, stored as `Wrapped`.

                case some(Wrapped)

                /// Creates an instance that stores the given value.

                public init(_ some: Wrapped)

                其他部分省略。。。。

    }

    我们看到,可选类型 Optional<Wrapped> 是一个枚举,有两个成员:none 和 some(Wrapped),表示可能没有值或者可能有值。

    var name: String?

    print(name)

    //打印:nil

    name = "haha"

    print(name)

    //打印:Optional("haha")

    上述例子,name声明为可选类型,没有初始化的时候,自动置为nil。当你声明一个可选变量或常量但没有赋初值,它们都会被自动置为nil。

    注意:Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型,但非可选的类型值不能置为nil

    if 语句以及强制解析

    可以使用 if 语句 和 nil 比较来判断一个可选值是否有值:

    if name != nil {

    print(name!)

    }

    //打印:"haha"

    当确定可选值有值的时候,可以在变量名后跟 !符号来强制解析该可选值,注意,不能用 !强制解析不包含值的可选值,否则导致运行出错。

    可选绑定

    使用可选绑定来判断一个可选值是否包含值,若包含值则赋给一个临时变量或常量。如下可选绑定用在 if  语句中:

    if let nick = name {

    print(nick)

    }

    //打印:"haha"

    这段代码可以理解为:可选值 name 包含一个值“haha”,则创建一个临时的新常量 nick 并把可选值 name 的值赋给它。

     还可以包含多个可选绑定或多个布尔条件在一个 if 语句中,只要使用逗号分开就行。只要有任意一个可选绑定的值为nil,或者任意一个布尔条件为false,则整个if条件判断为false。

    隐式解析可选类型

    有时候在程序中,第一次赋值后,可以确定一个可选类型总是有值,这样,在以后的调用中总是判断和解析可选值是效率低下的,这种类型的可选状态为被定义为隐式解析可选类型。把想要用作可选类型的 ?改为 !来声明一个隐式解析可选类型。隐式解析可选类型依然是一个可选类型,可选类型的特性它同样适用,只是注意,当隐式解析可选项值为 nil 的时候解析取值,会运行出错。如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型。

    var hehe: String! = "hehe"

    var s1: String = hehe  //s1类型是 String

    var s2 = hehe        //s2类型是由 hehe 推断出为 可选类型 String?,所以下面打印格式不同

    print(hehe,s1,s2)

    //打印:hehe hehe Optional("hehe")

    相关文章

      网友评论

        本文标题:swift 可选类型(optional)

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