前言
最近在看swift的開發(fā)tips,其中有一個自己比較感興趣的就是多元組,打算和大家分享一下我理解中多元組的使用以及對關鍵字inout的理解。
元組的定義
元組是Objective-C中沒有的數(shù)據(jù)結構,與數(shù)組類似,都是表示一組數(shù)據(jù)的集合。說到與數(shù)組類似,但是也有區(qū)別的地方:元組的長度任意,元組中數(shù)據(jù)可以是不同的數(shù)據(jù)類型。
元組的定義很簡單的,用小括號括起來,里面的元素以逗號隔開,例如:
let user = ("小陳陳" ,true, 22)
元組的基本用法
1、可以通過索引去訪問
let user = ("小陳陳" ,true, 22)
print(user.0)//小陳陳
2、可以把元組分解開,然后再去使用
let (name,isFemale,age) = user
print(name)//小陳陳
3、如果你只需要一部分的值,可以用“_”來代替忽略掉其他部分
let (name,_,_) = user
print(name)//小陳陳
4、上面的使用看起來有點繁瑣,有個簡化的方式就是定義的時候給每個元素單獨命名
let user = (name:"小陳陳",isFemale:true,age:22)
print(user.name)//小陳陳
print(user.0)//小陳陳
inout的作用
聲明函數(shù)時,在參數(shù)前面用inout修飾,在函數(shù)內部實現(xiàn)改變外部參數(shù)。
需要注意幾點:
1、 只能傳入變量,不能傳入常量和字面量
2、傳入的時候,在變量名字前面用&符號修飾表示
3、inout修飾的參數(shù)是不能有默認值的,有范圍的參數(shù)集合也不能被修飾
4、一個參數(shù)一旦被inout修飾,就不能再被var和let修飾了
在Swift中inout參數(shù)前面使用的&符號可能會給你一種它是傳遞引用的印象,但是事實并非如此,引用官方的話就是:
inout參數(shù)將一個值傳遞給函數(shù),函數(shù)可以改變這個值,然后將原來的值替換掉,并從函數(shù)中傳出
元組和inout的運用
前面是我對元組簡單的一個理解,有了這樣的認識之后再去看Swifter里面講解的多元組的時候就會容易理解。里面舉了一個例子是交換輸入,普通的程序員普遍的寫法:
func swapMe<T>(a: inout T, b: inout T) {
let temp = a
a=b
b = temp
}
使用多元組之后的寫法:
func swapMe<T>(a: inout T, b: inout T) {
(a,b) = (b,a)
}
兩個方法達到的目的是一樣的,但是他們的實現(xiàn)方法是不一樣。最大的區(qū)別就是第一個方法開辟了一個額外的空間來完成交換,而使用元組的方法則不去開辟一個額外的空間。他們的調用方法是一樣的
var a: Int = 1
var b: Int = 2
swapMe(a: &a, b: &b)
print(a,b)//2,1
如果大家對inout的功能還存在疑惑的地方,我們換一種寫法來比較一下:
func swapMe<T>( a: T, b: T){
var b = b
var a = a
(a,b) = (b,a)
print(a,b)//1,2
}
swapMe(a: a, b: b)
print(a,b)//2,1
在參數(shù)前面用inout修飾的方法,在函數(shù)內部實現(xiàn)改變外部參數(shù)。參數(shù)前面沒有用inout修飾的方法,在函數(shù)執(zhí)行體里面確實是交換了兩個數(shù),但是外部的參數(shù)是沒有改變。
總結
這次的學習總結寫的有點雜,對于元組,我還是推薦大家多使用。但是關鍵字inout大家就要慎用了,畢竟他會直接改變你外部參數(shù)的值,有利也有弊。