Swift-可選型學習筆記

swift 邊學邊忘.在工作中使用的oc.真是費勁啊.
這次好好做個筆記,忘了回來翻翻~
學習方法:是看慕課網(wǎng)的視頻,看了官方文檔,很多寫都不清楚,繞來繞去的,還是沒明白.可能還是功力不夠吧.

(一)為什么要有可選型

swift的設(shè)計者認為我們不應(yīng)該用同一個類型中的某一個特殊值來代表沒有這個概念.比如說:我們不應(yīng)該用Int類型中的0 來代表沒有這個概念.而應(yīng)該用統(tǒng)一的一個符號或者值來代表這個沒有.

476E8D2F-4F41-4CA6-BB48-66FEBB68FBF6.png

總結(jié):可以看出可選性 就是說明這個變量 有可能為空.

(二)可選型解包

可選性不能直接使用

4252DA19-66C4-4DE6-B9CA-212DE60C9428.png
解包方法一:強制解包

在后面加一個感嘆號(!)

print(errorCode2!+2)

但是這樣是有風險的 這個意識一定要有.每次強制解包使用的時候都要注意.
一般是這樣寫:

if errorCode2 != nil{
print(errorCode2!+3)
}
解包方法二: if let 解包 ,賦值的過程就是一個嘗試解包的過程
if let errorCode2 = errorCode2{
print(errorCode2+3)
}

這個命名可以和原來的errorCode2一致.在后面使用的時候,就不用強制解包.

解包方法三:如果多個變量解包,可以一起解包
if let errorCode2 = errorCode2,imoptional = imoptional{
print(errorCode2+3)
print(imoptional)
}

也可以加入條件

if let errorCode2 = errorCode2,imoptional = imoptional where errorCode2 == 200{
print(errorCode2+3)
print(imoptional)
}

(三)Option Chaining 和 Nil-Coalesce

if let errorMessage = errorMessage{
errorMessage.uppercaseString
}
errorMessage?.uppercaseString 這句代碼和上面的兩行代碼意思一致.

我們獲取這個變量,在使用的時候,它還是一個可選型

 let upStr = errorMessage?.uppercaseString //upStr 是一個隱式的可選型

使用的時候還是不安全 所以我們還需要判斷 不過我們可以使用可選鏈

if let upStr = errorMessage?.uppercaseString{
print(upStr)
}

一個非常常見的一個OC寫法,聲明一個變量,在函數(shù)中進行判斷,如果有值,那么賦值成功,如果沒有值,那么我們會賦一個默認值.我們這樣寫其實就是希望這個message 永遠有值.所以沒有使用?標明可選型.

var message:String 
code message
//但是初始化的時候不進行賦值.我們在這里使用的 時候就會很危險.

if let errorMessage = errorMessage{
message = errorMessage
}else{
message = "No Error"
}

這個時候我們可以使用三目運算符

var message =  errorMessage == nil ? errorMessage : "No Error"

還有swift提供一種更簡單的寫法 兩個??表示這個變量確實是nil

var message =  errorMessage ?? "No Error" 

(三)可選型的一個實際應(yīng)用

var ageInput:String = "16"

var age = Int(ageInput)

if let age = Int(ageInput) where age < 20 {
print("You're a teenager")
}

(四)隱式可選型 當使用的時候可以不對他解包 默認是nil

var message:String! = nil

var errorMessage:String! = nil
errorMessage = ""
"The Message"+errorMessage

一個隱式可選型的例子

<pre>import UIKit

class City {
let cityName:String
var country:Country
init(cityName:String,coutry:Country){
self.cityName = cityName
self.country = coutry
}
}

class Country{
let countryName:String
var capitalCity:City!//隱式可選型 當使用的時候可以不對他解包 默認的情況是一個Nil

init(countryName:String,capitalCity:String){
    self.countryName = countryName
    self.capitalCity = City(cityName:capitalCity,coutry: self)
}

func showInfo() {
    print("This is \(countryName)")
    print("The capital is \(capitalCity.cityName)")
}

}

let china = Country(countryName: "China",capitalCity: "Beijing")
china.showInfo()</pre>

小結(jié):
定義變量的第一種方式:

1.var errorMessage:String //表示errorMessage是String類型,不能為空,nil
errorMessage = nil  這種做法都不允許
var message:String?
errorMessage = message 這種做法都不允許

定義變量第二種方式

var errorMessage:String? //表示errorMessage是String可選類型,可以為空
errorMessage = nil
errorMessage = ""
"The Message"+errorMessage! //但是使用的時候必須解包

定義變量第三種方式

var errorMessage:String! //表示errorMessage是String可選類型,可以為空
errorMessage = nil
errorMessage = ""
"The Message"+errorMessage //但是使用的時候不用解包
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容