swift 中的Array和ArraySlice

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

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

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

var num:Int

num = arrayAny[0] as! Int(num = arrayAny[0] 提示類型不匹配錯誤!)

2.創建數組

(1)空數組:

var array = [Any]()

(2)帶有初值的數組

創建具有3個元素并初始值為零的 int 類型數組:

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

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

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

3、訪問和修改數組

(1)獲取數組元素個數(array.count)

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

(3)數組追加元素

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

(4)插入元素

插入單個元素:

morenArr.insert(6, at: 0)

插入把數組內的所有元素插入:

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

(5) 刪除元素

array.remove(at: 0)

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

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

(6)數組可以直接相加

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

var array2 = [11, 33, 44]

var array3 = array1 + array2

(7)排序

升序排序:系統默認的排序方法:

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(數組片段)

ArraySlice 既是Array的一部分有是獨立的一個對象,主要用于把一個數組中間的幾個數據切片到一個新的數組中。eg:

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

var arrB = [99, 77, 66]

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

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

上面的例子已經基本把ArraySlice的創建及使用方法說了,下面在說幾點要注意的:

(1)ArraySlice[num]

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

直接創建的ArraySlice

var arrslice: ArraySlice = [88, 99]//這里我直接創建了個ArraySlice

//現在要改變arrslice的第一個元素為33

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

從數組中取

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

var slice = entrity[1...3]

slice[0] = 4//越界

為什么呢,這是因為這時【num】中的num表示的是第幾個元素,是從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

這是要替換另一個數組的ArraySlice時,就是

var arrB = [22, 33]

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


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

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不能長期保存,可能會有內存泄漏,附上官方api的截圖

警告:不建議長時間的存儲ArraySlice實例

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容