iOS:swift :可選類型

import UIKit

/*:
可選類型
* 可選類型表示變量能夠有值, 也能夠沒有值
* 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)
相關文章
相關標籤/搜索