• Swift学习-----可选类型


    可选类型
    * 可选类型表示变量可以有值, 也可以没有值
    * C 和 Objective-C 中并没有可选类型这个概念
    * Swift中只有可选类型才可以赋值为nil
    * 如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil
    
    * 格式: Optional<类型>  或 在类型后面加上?号
    
    可选类型的取值是一个枚举
    * None 没有值
    * Some 有值
    
    * 由于可选类型在Swift中随处可见, 所以系统做了一个语法糖, 在类型后面加上?
    注意:
    * nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
    * Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针, 所以Objective-C只有对象类型才能被设置为nil(基本类型不行)。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。

    var number: Optional<Int>

    number = 10

    number = nil

    var number1: Int

    number1 = 10

    //number1 = nil

    // 推荐

    var number2: Double?

    number2 = 20.1

    //number2 = nil 

    // Swift中可选类型的值不能当做普通类型的值来使用

    // 如果想使用可选类型的值必须进行解包操作

    // 只需要在变量/常量后面加上! 就可以解包

    // 解包代表着告诉系统, 该变量/常量中一定有值

    var number3: Double

    number3 = 3.14

    print(number2)

    print(number2!)

    print(number3)

    let sum = number2! + number3

    强制解析(forced unwrapping)
    * init? 构造函数, ?表示不一定能够实例化出对象
    * !表示告诉编译器一定有值, 编译能够通过, 如果运行时没有值就会直接崩溃
    * 提示: ? 和 ! 是所有刚刚接触Swift的OC程序员最最蛋疼的问题, 前期开发要注意多看文档和利用编译器提示解决(option + click)
    注意
    * 在Swift开发中, 尽量不要使用强制解包, 不安全
    let url = NSURL(string: "http://www.520it.com")
    print(url)
    //print(url!)
    let url1 = NSURL(string: "http://www.520it.com/图片/abc.png")
    print(url1)
    可选绑定(optional binding)
    * 不需要考虑url是否有值, 能进入{}一定有值
    * 不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量
    * 可选绑定可以用在if和while语句中
    
    提示:
    * 在实际开发中,使用频率很高
    
    注意:
    * 可选绑定中的变量/常量只能在if后面的{}中使用
    if let temp = url {
        print(temp)
    }
    
    let value1: Int? = 10
    let value2: Int? = 20
    let value3: Int? = 30
    let value4: Int? = 40
    
    if let temp1 = value1 {
        if let temp2 = value2 {
            if let temp3 = value3 {
                if let temp4 = value4 {
                    let sum = temp1 + temp2 + temp3 + temp4
                }
            }
        }
    }
    guard
    * guard语句是在Swift 2.0中引进的,它是用途是在未满足某个条件时,提供一个退出的路径
    * 格式: guard 表达式 else{}
    注意:
    * guard中的变量/常量 可以在guard后面使用
    * guard一般用于避免使用强制拆包, 优化代码结构
    func test(){
        let value1: Int? = 10
        let value2: Int? = 20
        let value3: Int? = 30
        let value4: Int? = 40
        
        guard let temp1 = value1 else{
            return
        }
        guard let temp2 = value2 else{
            return
        }
        guard let temp3 = value3 else{
            return
        }
        guard let temp4 = value4 else{
            return
        }
        let sum = temp1 + temp2 + temp3 + temp4
        print(sum)
    }
    test()
    隐式解析可选类型(implicitly unwrapped optionals)
    * 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
    * 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
    * 格式: 将可选类型后面的?改为!
    * let xmgButton: UIButton!
    
    注意:
    * 如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型
    
    let intValue: Int?
    intValue = 10
    print(intValue)
    print(intValue!)
    
    if intValue != nil {
        print(intValue!)
    }
    
    if let temp = intValue {
        print(temp)
    }
    
    var doubleValue: Double!
    doubleValue = nil
    doubleValue = 3.14
    print(doubleValue)
  • 相关阅读:
    第八周学习进度
    《梦断代码》阅读笔记01
    冲刺记录一
    NABCD简介
    第七周学习进度
    《编程珠玑》阅读笔记03
    第六周学习进度
    数据库数据定期同步实现
    数据库之间的数据同步
    数据同步——otter
  • 原文地址:https://www.cnblogs.com/sleblogs/p/5774658.html
Copyright © 2020-2023  润新知