swift optional总结 (一)

来源:互联网 发布:steam中文版 mac 编辑:程序博客网 时间:2024/06/04 20:31
  1. Optional类型允许变量没有值,其他类型的必须先初始化再使用,否则报错
  2. 声明Optional类型变量时候如果没有初始化值那么默认为nil 例如
    var perhapsInt: Int?
    var perhapsStr: String?
  3. Optional类型变量的真实值是被封装起来的,包装在其枚举值Some中,如上{Some 123};
  4. 使用问号?表示封装(可能有值可能没有),使用感叹号!表示拆封取值(强制认为有值,如果没有则会触发运行时错误),有点类似“Has a value?” —— "I assure it has!";
  5. 选配(Optionals)类型似于使用 nil 在 Objective-C 中的指针,但它们对任何类型,不只是在类上工作。

  6. 强制解包,如果定义了一个optional的值,想获得它的值则必须解开它,方法就是在末尾添加!
  7. nil在swift中并不是代表一个指针指向一个不存在的对象而是代表特定类型的值的缺失。任何具体类型的可选类型的值都能被设为nil,例如:String,int而不是仅限于对象类型
  8. 拆包又分为显示和隐式两种方式
  9. 显示拆包例如

    var str: String? = "Hello World!"

    str//Hello World!

  10. 隐式拆包例如

    var str: String! = "Hello World!"

    str //Hello World!

    可以看到没有使用(?)进行显式的折包也得到了Some中的值,这个语法相当于告诉编译器:在我们使用Optional值前,这个Optional值就会被初始化,并且总是会有值,所以当我们使用时,编译器就帮我做了一次拆包。如果你确信你的变量能保证被正确初始化,那就可以这么做,否则还是不要尝试为好
  11. Optional binding 可选绑定
    在说Optional Binding之前,我想先说下Xcode6 Beta5在这一版中的一个小变化:在Xcode6 Beta5之前,如果是一个Optional值,可以直接放到条件判断语句中,如:

    var str: String? = "Hello World!"

    if str {

        "not nil"

    else {

        "nil"

    }

    如果不是nil,则右边的Playground会显示“not nil”;反之则显示“nil”,但是至Xcode6 Beta5开始,这样就不能通过编译器了,你需要用下面这种方式来代替:

    var str: String? = "Hello World!"

    if str != nil {

        "not nil"

    else {

        "nil"

    }

    看似合理,但是在某种情况下会非常不爽难过,比如你在str != nil条件成真后接着在上下文中使用str,会被要求进行拆包,我们以一个Int类型的Optional来做示例:

    var count: Int?

    count = 100

    if count != nil {

        "count is " + String(count!)    //count is 100

    else {

        "nil"

    }

    我在把count强转成String的时候被要求拆包了,这是因为count本身是一个Optional的类型,为了避免在条件判断语句后执行一次或更多次的拆包,Swift引进了Optional Binding,我们就可以这样做:

    var count: Int?

    count = 100

    if let validCount = count {

        "count is " + String(validCount)    //count is 100

    else {

        "nil"

    }

    通过在条件判断语句中(如if、while等)把Optional值直接给一个临时常量,Swift会自动检测Optional是否包含值,如果包含值,会隐式的拆包并给那个临时常量,在接下来的上下文中就能直接使用这个临时常量了,这样是不是就觉得很爽呢微笑

    注:在Optional Binding中,除了以常量的方式去接收拆包的值之外,也能以一个变量的形式
    去接收,但相信在大多数情况下我们只是使用那个值就行了,并不会去改变它。
0 0
原创粉丝点击