swift 邊學邊忘.在工作中使用的oc.真是費勁啊.
這次好好做個筆記,忘了回來翻翻~
學習方法:是看慕課網(wǎng)的視頻,看了官方文檔,很多寫都不清楚,繞來繞去的,還是沒明白.可能還是功力不夠吧.
(一)為什么要有可選型
swift的設(shè)計者認為我們不應(yīng)該用同一個類型中的某一個特殊值來代表沒有這個概念.比如說:我們不應(yīng)該用Int類型中的0 來代表沒有這個概念.而應(yīng)該用統(tǒng)一的一個符號或者值來代表這個沒有.

總結(jié):可以看出可選性 就是說明這個變量 有可能為空.
(二)可選型解包
可選性不能直接使用

解包方法一:強制解包
在后面加一個感嘆號(!)
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 //但是使用的時候不用解包