元組
1.介紹
元組是Swift中特有的,OC中并沒(méi)有相關(guān)類型
它是一種數(shù)據(jù)結(jié)構(gòu)划纽,在數(shù)學(xué)中應(yīng)用廣泛
類似于數(shù)組或者字典
可以用于定義一組數(shù)據(jù)
組成元組類型的數(shù)據(jù)可以稱為“元素”
2.使用
2.1 定義
假設(shè)定義一組數(shù)據(jù) 包括 姓名 年齡 身高 下面分別使用數(shù)組藐吮、字典和元組來(lái)定義
1.使用數(shù)組
let array :[Any] = ["lwy",18,1.88]
1.1>取數(shù)據(jù)
let name1 =array[0] //取名字
let age1 =array[1] ?//取age
let height1 =array[2] ?//取身高
2.使用字典定義數(shù)據(jù)
let dict :[String:Any] = ["name":"lwy","age":18,"height":1.88]
2.1>取出相應(yīng)的數(shù)據(jù)
dict["name"]? //2.1>取名字
dict["age"]? //2.2>取年齡
dict["height"]? //2.3>取身高
//3.使用元組 ?不同于數(shù)組和字典是使用中括號(hào)[],元組是使用() 元組一般是用于方法的返回值
let info = ("lwy",18,1.88)
取數(shù)據(jù) ( 元組可以通過(guò)下標(biāo)來(lái)直接取數(shù)據(jù) ?跟數(shù)組不同的是 ?數(shù)組取下標(biāo)的是array[0] ?元組的話是info.0)
let myName =info.0
let myAge =info.1
let myHeight =info.2
但是通過(guò)這樣的方式取值的話不容易明白取出的是什么數(shù)據(jù),
2.2 別名
雖然我們可以通過(guò) 元組名 + . + 下標(biāo)值的方式取出相應(yīng)的值硝逢,但是我們很難明白我們到底取出的是什么數(shù)據(jù)的妖,這個(gè)時(shí)候我們可以給元組中的每一個(gè)元素起個(gè)別名
跟字典很相似 不過(guò)跟字典不同的是字典的話是中括號(hào)[], 元組的話是小括號(hào)(), 而且元組的別名不用雙引號(hào),直接寫字符璧眠;字典的話我們一般都是用字符來(lái)作為key的缩焦, 不過(guò)在swift中其它數(shù)據(jù)類型也可以作為key读虏,比如Int類型
?let userInfo = (userName:"lwy",userAge:18,userHeight:1.88)
這樣的話我們可以直接通過(guò)每個(gè)元素的別名去處相應(yīng)的數(shù)據(jù)
userInfo.userName
userInfo.userAge
userInfo.userHeight
起了別名之后我們還是可以通過(guò)下標(biāo)來(lái)取值
userInfo.2 //取出的數(shù)據(jù)跟userInfo.userHeight是一樣的
我們也可以直接把每個(gè)元素的別名來(lái)作為元組的名稱
let ?(name2, age2, height2) = ("lwy",18,1.88)
在取數(shù)據(jù)的直接使用別名
print(name2)
print(age2)
print(height2)
可選類型
1.概念
在OC開(kāi)發(fā)中,如果一個(gè)變量暫時(shí)不使用,可以賦值為0(基本屬性類型)或者賦值為空(對(duì)象類型)
在swift開(kāi)發(fā)中,nil也是一個(gè)特殊的類型.因?yàn)楹驼鎸?shí)的類型不匹配是不能賦值的(swift是強(qiáng)類型語(yǔ)言)
但是開(kāi)發(fā)中賦值nil,在所難免.因此推出了可選類型
可選類型的取值:
空值
有值
比如
let name : String = nil 這樣寫是錯(cuò)誤的,雖然在OC中是正確的舌界,因?yàn)樵赟wift中nil也是一個(gè)特殊類型掘譬,它并不是字符類型,類型是不一致的呻拌,所以不能賦值葱轩,因?yàn)樵趕wift中不同類型是不能賦值的(swift是強(qiáng)類型語(yǔ)言)
2.定義
2.1 常規(guī)方法(不常用)
//可選類型的創(chuàng)建
var name :Optional<String> = nil //可以類比數(shù)組的創(chuàng)建
//數(shù)組的創(chuàng)建
var names : Array<String> = ["123"]
因?yàn)閯?chuàng)建的是數(shù)組,所以數(shù)據(jù)類型是Array藐握,數(shù)組里面存放的是String類型靴拱,所以是Array<String> ,?同理可選類型的創(chuàng)建,因?yàn)槭强蛇x類型,所以是Optional,可選類型存放的是字符串,所以是Optional<String>; ?我們可以往這個(gè)可選類型里面存放字符串, 就像能夠像數(shù)組中存放字符串一樣, ?區(qū)別就是數(shù)組里面可以存放多個(gè)字符串, ?可選類型只能存放一個(gè)字符串, ?如果再次往可選類型里面存放數(shù)據(jù), ?就會(huì)把之前的數(shù)據(jù)給覆蓋掉
2.2 第二種定義方法 (語(yǔ)法糖) ?let/var 名字 :類型? = 值 的形式
var name :String? =nil // 這種更常用一些
可選類型的使用
1. 給可選類型賦值
name = 18 // 這樣是錯(cuò)誤的, ?因?yàn)槲覀兌x的是只能存放字符串類型的可選類型
name="lwy" ?//正確寫法
2. 取出可選類型中的值
在取可選類型中的值的時(shí)候我們需要對(duì)可選類型進(jìn)行解包 解包方式: 可選類型!?
需要注意的一點(diǎn)是猾普, 在強(qiáng)制解包前需要判斷可選類型是否為nil袜炕,如果為nil,我們也進(jìn)行了強(qiáng)制解包初家,那么系統(tǒng)會(huì)崩潰
//在強(qiáng)制解包前先對(duì)可選類型進(jìn)行判斷是否為nil
if name!=nil {
print(name!)//每次打印都要解包
print(name!)
print(name!)
}
3.可選綁定
從上面可以看到偎窘, 我們?cè)谑褂每蛇x類型的值的時(shí)候, 每次都要強(qiáng)制解包溜在, 是比較麻煩的陌知, 我們可以這樣來(lái)使用
3.1>寫法一(不常用)
if let tempName = name {
print(tempName)//這樣的話就直接使用tempName ?不需要解包
print(tempName)
print(tempName)
}
其實(shí)上面的是進(jìn)行了兩步操作
1.先判斷name是否有值,如果沒(méi)有值則不執(zhí)行{}
?2.如果有值掖肋,系統(tǒng)會(huì)對(duì)可選類型name進(jìn)行解包仆葡,不需要我們自己解包,并把解包后的值賦值給前面的常量
3.2>寫法二(常用)
if let name = name{//定義的常量名可以和可選類型的名字一樣
print(name)//這里我們輸出的是常量name志笼,而不是可選類型name沿盅,因?yàn)閟wift和OC一樣,都有一個(gè)就近原則
}