swift 中的Array和ArraySlice

1.swift的存儲類型(所有類型,int, double, String······)

? ? ? Swift 數(shù)組用于存儲相同類型的值的順序列表。Swift 要嚴(yán)格檢查,它不允許錯(cuò)誤地在數(shù)組中存放了錯(cuò)誤的類型。(同一個(gè)Array中只能存儲相同的類型,聲明為Any的swift認(rèn)為其類型為Any)

var arrayAny:[Any] = [22, "ll", 66]

var num:Int

num = arrayAny[0] as! Int(num = arrayAny[0] 提示類型不匹配錯(cuò)誤?。?/p>

2.創(chuàng)建數(shù)組

(1)空數(shù)組:

var array = [Any]()

(2)帶有初值的數(shù)組

創(chuàng)建具有3個(gè)元素并初始值為零的 int 類型數(shù)組:

var morenArr = [Int].init(repeating: 0, count: 3) ? ?或

var morenArr:[Int] = [0, 0, 0] ? ? ? ? ? ? ?或

var morenArr = [0, 0, 0] ? //自動匹配類型

3、訪問和修改數(shù)組

(1)獲取數(shù)組元素個(gè)數(shù)(array.count)

(2)判斷數(shù)組是否為空(array.isEmpty)

(3)數(shù)組追加元素

array.append(55) ? 添加的類型要相同(Any聲明的可以隨便加)

(4)插入元素

插入單個(gè)元素:

morenArr.insert(6, at: 0)

插入把數(shù)組內(nèi)的所有元素插入:

morenArr.insert(contentsOf: threeDoubles, at: 3)? ? ? ? ? (threeDoubles是個(gè):【Int】)

(5) 刪除元素

array.remove(at: 0)

刪除所有:array.removeAll(),? ? array.removeAll(keepingCapacity: <Bool>)

array3.removeAll(keepingCapacity: false) 和 array3.removeAll(keepingCapacity: ture)還有array.removeAll()只有語義上的區(qū)別

(6)數(shù)組可以直接相加

var array1:[Int] = [22, 55, 66]

var array2 = [11, 33, 44]

var array3 = array1 + array2

(7)排序

升序排序:系統(tǒng)默認(rèn)的排序方法:

var array1:[Int] = [22, 55, 66]

var array2 = [11, 33, 44]

var array3 = array1 + array2

//將array3升序排序

array3.sorted()

var sortArr = ["kkk" , "lll", "dd", "gg"]

//將sortArr升序排序

sortArr.sorted()

自定義排序方式:

//將array3降序排序

array3.sorted { (num1, num2) -> Bool in

return num1 > num2

}

//將sortArr降序排序

sortArr.sorted { (string1, string2) -> Bool in

return string1 > string2

}

ArraySlice(數(shù)組片段)

ArraySlice 既是Array的一部分有是獨(dú)立的一個(gè)對象,主要用于把一個(gè)數(shù)組中間的幾個(gè)數(shù)據(jù)切片到一個(gè)新的數(shù)組中。eg:

let entrity = [1, 2, 3, 4, 5, 6] // 類型Array[Int]

var arrB = [99, 77, 66]

let slice = entrity[1...3]//取entity下標(biāo)1、2、3的元素組成slice(ArraySlice[Int])

arrB[1..<2] = slice//[99, 2, 3, 4, 66]//將arrB的下標(biāo)為1的元素([1..<2],大于等于1,小于2;也可以表示為[1...1])組成的數(shù)組片段,替換成slice

上面的例子已經(jīng)基本把ArraySlice的創(chuàng)建及使用方法說了,下面在說幾點(diǎn)要注意的:

(1)ArraySlice[num]

需要訪問ArraySlice中的元素時(shí)要注意,這里的【num】中的num指的不一定是下標(biāo),而是分情況而定(這個(gè)可能以后要改)。eg:

直接創(chuàng)建的ArraySlice

var arrslice: ArraySlice = [88, 99]//這里我直接創(chuàng)建了個(gè)ArraySlice

//現(xiàn)在要改變arrslice的第一個(gè)元素為33

arrslice[0] = 33 //arrslice[33, 99]

從數(shù)組中取

let entrity = [1, 2, 3, 4, 5, 6]

var slice = entrity[1...3]

slice[0] = 4//越界

為什么呢,這是因?yàn)檫@時(shí)【num】中的num表示的是第幾個(gè)元素,是從1開始的而不是0,解決方法有兩種:

第一種最直接:

let entrity = [1, 2, 3, 4, 5, 6]

var slice = entrity[1...3]

slice[1] = 4

let entrity = [1, 2, 3, 4, 5, 6]

var slice = Array(entrity[1...3])//slice:Array<Int>

slice[0] = 4

這是要替換另一個(gè)數(shù)組的ArraySlice時(shí),就是

var arrB = [22, 33]

arrB[1..<2] = ArraySlice(slice)


(2)Array可以和ArraySlice直接相加,這就解決了從最前和最后接ArraySlice的問題(這本來不是個(gè)問題);

let entrity = [1, 2, 3, 4, 5, 6]

let slice = entrity[1...3]//[2, 3, 4]

var arrB = [22, 33]

let ArrC = slice + arrB //arrC類型Array<Int>,[2, 3, 4, 22, 33]

arrB = ArrC ? ? ?...//等同于,arrB[0..<0] = slice


let arrD = arrB + slice//arrD類型Array,[22, 33, 2, 3, 4]

arrB = arrD;? ///等同于:let c = arrB1.count - 1; arrB1[c..<c] = slice


(3)ArraySlice不能長期保存,可能會有內(nèi)存泄漏,附上官方api的截圖

警告:不建議長時(shí)間的存儲ArraySlice實(shí)例

由于一個(gè)ArraySlice實(shí)例呈現(xiàn)的是某個(gè)比較大的數(shù)組上的一個(gè)視圖。如果這個(gè)原始數(shù)組已經(jīng)結(jié)束了其生命周期,存儲這個(gè)切片實(shí)例可能會延長那些不能再被訪問的數(shù)組元素的存活時(shí)間,這就造成了明顯的內(nèi)存和對象泄露。為了防止這個(gè)影響的發(fā)生,只在臨時(shí)性的計(jì)算時(shí),使用ArraySlice。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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