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: Intapp

number1 = 10函数

//number1 = nil优化

 

// 推荐url

var number2: Double?spa

number2 = 20.1指针

//number2 = nil code

// 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)
相关文章
相关标签/搜索