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。
