Swift中的 数组Array

数组的创建

  • 字面量创建
  1. 可以使用数组字面量来初始化一个数组,它是一种以数组集合来写一个,或者多个值的简写方式,数组字面量写作一系列的值,用都好分隔,用方括号括起来
  2. 创建空数组的时候必须携带类型信息
  3. 如果内容已经提供了类型信息,你可以通过空数组字面量来创建一个空数组
var array = [1, 2, 3, 4]
array = []
let arr:[Int] = []
let arr2 = [Int]()
let arr3: Array<Int> = []
  • 初始化器
  1. 初始化器有两种方式 1.类型 2.Array<类型>()
var myArray = [String]()
var myArray2 = Array<String>()

2.初始器参数

  • init(repeating repeatedValue: Element, count: Int)
  • init(arrayLiteral elements: Element...)
let fiveZs = Array(repeating: "Z", count: 5)
print(fiveZs)
let chars = Array("hello")
print(chars)
let numbers = Array(1...9)
print(numbers)
  • init<S>(_elements: S) where S : Sequence, Self.Element == S.Element
  • init(from decoder: Decoder) throws
let number = [Int](0...7)
print(number)
let persons = ["zhangsan": 27, "lisi": 28, "wangwu": 29]
let names = [String](persons.keys)
print(names)

数组的遍历和索引(访问和操作数组)

  • 数组遍历
  1. For-in
let numbers = [Int](1...7)
for index in numbers {
    print(index)
}

  1. forEach 方法
    • 无法使用 break 或 continue 跳出或者跳过循环
    • 使用 return 只能退出当前一次循环的执行体
let numbers = [Int](0...7)
numbers.forEach { (num) in
    if num == 3 {
        return
    }
    print(num * 10)
}

3.同时得到索引和值 enumerated()

let numbers = [Int](1...7)
for (index, num) in numbers.enumerated() { //拆包
    print("the index is \(index)")
    print(num * 10)
}

4.使用 Iterator 遍历数组

let numbers = [Int](1...7)
var numIterator = numbers.makeIterator() //迭代器
while let num = numIterator.next() {
    print(num * 10)
}
  • 数组索引
  1. starIndex 返回第一个元素的位置,对于数组来说,永远都是0
  2. endIndex 返回最后一个元素索引 +1 的位置,对于数组来说,等同于 count
  3. 如果数组为空,startIndex 等于 endIndex
  4. indices 获取数组的索引区间
let numbers = [Int](1...7)
for i in numbers.indices {
    print(numbers[i] * 10)
}

数组访问和操作(查找操作)

  • 判断是否包含指定元素
  1. contains(_:) 判断数组是否包含给定元素
  2. contains(where:) 判断数组是否包含符合给定条件的元素
let numbers = [Int](5...10)
print(numbers.contains(5)) 
print(numbers.contains(where: { $0 > 9 }))
  • 判断所有元素符合某个条件
  1. allSatisfy(_:) 判断数组的每一个元素都符合给定的条件
let numbers = [Int](5...10) 
print(numbers.allSatisfy({ $0 > 7}))
print(numbers.allSatisfy({ $0 > 4}))
  • 查找元素
  1. first 返回数组第一个元素 (Optional), 如果数组为空, 返回nil
  2. last 返回数组最后一个元素 (Optional), 如果数组为空,返回nil
  3. first(where:) 返回数组第一个符合给定条件的元素 (Optional)
  4. last(where:) 返回数组最后一个符合给定条件的元素 (Optional)
let numbers = [Int](5...10)
print(numbers.first)
print(numbers.last)
print(numbers.first(where: { $0 > 7 }))
print(numbers.last(where: { $0 < 7 }))
  • 索引查找
  1. firstIndex(of:) 返回给定的元素在数组中出现的第一个位置 (Optional)
  2. lastIndex(of:) 返回给定的元素在数组中出现的最后一个位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(of: 30))
print(array.lastIndex(of: 20))
  1. firstIndex(where:) 返回符合条件的第一个元素的位置 (Optional)
  2. lastIndex(where:) 返回符合条件的最后一个元素的位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(where: { $0 > 25 }))
print(array.lastIndex(where: { $0 > 25 }))
  • 查找最大最小元素
  1. min() 返回数组中最小的元素
  2. max() 返回数组中最大的元素
  3. min(by:) 利用给定的方式比较元素,并返回数组的最小元素
  4. max(by:) 利用给定的方式比较元素,并放回数组的最大元素
var array = [7, 5, 30, 40, 32, 40, 5]
print(array.min())
print(array.max())

var errors = [(0, "worring"), (100, "error"), (200, "success")]
print(errors.min(by: { a, b in a.0 < b.0 }))
print(errors.max(by: { a, b in a.0 < b.0 }))

errors = [(0, "b"), (100, "a"), (200, "d")]
print(errors.min(by: { a, b in a.1 < b.1 }))

数组添加和删除操作

  • 在末尾添加
  1. append(:) 在末尾添加一个元素
var numbers = [Int](2...7)
numbers.append(100)
print(numbers)
  1. append(contentsOf:)在末尾添加多个元素
var numbers = [Int](2...7)
numbers.append(contentsOf: 200...203)
print(numbers)
  • 在任意位置插入
  1. insert(_:at:) 在指定的位置插入元素
var numbers = [Int](2...7)
numbers.insert(-1, at: 1)
print(numbers)
  1. insert(contentsOf:at:) 在指定位置插入多个元素
var numbers = [Int](2...7)
numbers.insert(contentsOf: 100...105, at: 1)
print(numbers)

3.字符串也是 Collection, Element 是 Character 类型

var chars: [Character] = ["a", "b", "c"]
chars.insert(contentsOf: "hello", at: 0)
print(chars)
  • 移除单个元素
  1. remove(at:) 移除并返回指定位置的一个元素
var numbers = [Int](2...7)
let removeNum = numbers.remove(at: 1)
print(removeNum)
print(numbers)
  1. removeFirst() 移除并返回数组的第一个元素
var numbers = [Int](2...7)
let num = numbers.removeFirst() //不能为空数组
print(num)
print(numbers)
  1. removeLast() 移除并返回数组的最后一个元素
var numbers = [Int](2...7)
let endNum = numbers.removeLast() //不能为空数组
print(endNum)
print(numbers)
  1. popFirst() 移除并返回数组的第一个元素(optional), 数组为空返回nil
let popNum = numbers.popLast() //可为空数组
print(popNum)
print(numbers)
  • 移除多个元素
  1. removeFirst(:) 移除数组前面多个元素
var numbers = [Int](2...7)
numbers.removeFirst()
print(numbers)

numbers.removeFirst(2) //从开始移除的个数
print(numbers)
  1. removeLast(:) 移除数组后面多个元素
var numbers = [Int](2...7)
numbers.removeLast()
print(numbers)

numbers.removeLast(2) //从末尾移除的个数
print(numbers)
  1. removeSubrange(:) 移除数组中给定范围的元素
numbers.removeSubrange(1...3)
print(numbers)
  1. removeAll() 移除数组所有元素
numbers.removeAll()
print(numbers)
print(numbers.capacity)
  1. removeAll(keepingCapacity:) 移除数组所有元素,保留数组容量(如果移除之后重新添加,建议保留数组容量)
numbers.removeAll(keepingCapacity: true)
print(numbers)
print(numbers.capacity)

ArraySlice(数组切片)

  • 移除多个元素
  1. ArraySlice 是数组或者其他 ArraySlice 的一段连续切片,和原数组共享内存。
  2. 当要改变 ArraySlice 的时候,ArraySlice 会 copy 出来,形成单独的内存
  3. ArraySlice拥有和 Array 基本完全类似的方法
  • 通过 Drop 得到 ArraySlice
  1. dropFirst(:) 移除原数组前面指定个数的元素,得到一个 ArraySlice
  2. dropLast(:) 移除原数组后面指定个数的元素,得到一个 ArraySlice
  3. drop(:) 移除原数组符合指定条件的元素得到一个 ArraySlice
let numbers = [1, 10, 21, 98, 32, 53, 67, 89]
print(numbers)
print(numbers.dropFirst())
print(numbers.dropFirst(3))
print(numbers.dropLast())
print(numbers.dropLast(3))
print(numbers.drop(while: { $0 < 50 }))
  • 通过 prefix 得到 ArraySlice
  1. prefix() 获取数组前面指定个数的元素组成的 ArraySlice
  2. prefix(upTo:) 获取数组到指定位置 (不包含指定位置) 前面的元素组成的 ArraySlice
  3. prefix(through:) 获取数组到指定位置 (包含指定位置) 前面的元素组成的 ArraySlice
  4. prefix(while:) 获取数组前面符合条件的元素 (到第一个不符合条件的元素截止) 组成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.prefix(4))
print(numbers.prefix(upTo: 4))
print(numbers.prefix(through: 4))
print(numbers.prefix(while: { $0 < 5 })) 
  • 通过 suffix 得到 ArraySlice
  1. suffix() 获取数组后面指定个数的元素组成的 ArraySlice
  2. suffix(from:) 获取数组从指定位置到结尾 (包含指定位置) 的元素组成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.suffix(3))
print(numbers.suffix(from: 5))
  • 通过 Range 得到 ArraySlice
  1. 可以通过对数组下标指定 Range 获取 ArraySlice,可以使用闭区间、半开半闭区间、单侧区间、甚至可以只是用...来获取整个数组组成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers[3...5])
print(numbers[3..<5])
print(numbers[...2])
print(numbers[..<2])
print(numbers[6...])
print(numbers[...])
  • ArraySlice 转为 Array
  1. ArraySlice 无法直接赋值给一个 Array 的常量或变量,需要使用 Array(slice)
var numbers = [Int](1...9)
let slice = numbers[3...5]
numbers = Array(slice)
print(numbers)
  • ArraySlice 和原 Array 相互独立
  1. ArraySlice 和原 Array 相互独立的,他们添加删除元素不会影响对方
var numbers = [Int](1...3)
var slice = numbers.dropLast()
numbers.append(4)
print(slice)
print(numbers)
slice.append(5)
print(slice)
print(numbers)

数组重排

  • 数组元素的随机化
  1. shuffle() 在原数组上将数组元素打乱,只能作用在数组变量上
  2. shuffled() 返回原数组的随机化数组, 可以作用在数组常量和变量上,并不改变原数组
var numbers = [Int](0...9) //随机播放
numbers.shuffle()
print(numbers)
let array = [Int](0...9)
var arr = array.shuffled()
print(arr)
print(array)
  • 数组的逆序
  1. reverse() 在原数组上将数组逆序,只能作用在数组变量上
  2. reversed() 返回原数组的逆序“集合表示”,可以作用在数组变量和常量上,该方法不会重新分配新内存空间
var numbers = [Int](0...9)
numbers.reverse()
print(numbers)
let array = [Int](0...9)
var arr = array.reversed()
print(arr) //共享内存
print(array)
for index in arr {
    print(index)
}
  • 数组的分组
  1. partition(by belongsInSecondPartition:(Element) throws -> Bool) 将数组以某个条件分组,数组前半部分都是不符合条件的元素,数组后半部分都是符合条件的元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
let index = numbers.partition { (element) -> Bool in
    element > 30
}
print(numbers)
let partition1 = numbers[..<index]
let partition2 = numbers[index...]
print(partition1)
print(partition2)
  • 数组的排序
  1. sort() 在原数组上将元素排序,只能组用于数组变量。
  2. sorted() 返回原数组的排序结果数组,可以作用在数组变量和常量上
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.sort()
print(numbers)

let array = [10, 20, 45, 30, 98, 101, 30, 4]
let arr = array.sorted()
print(arr)
print(array)
  • 交换数组两个元素
  1. swapAt(::) 交换指定位置的两个元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.swapAt(numbers.startIndex, numbers.endIndex - 1)
print(numbers)

数组拼接

  • 字符串数组拼接
  1. joined() 拼接字符串数组里的所有元素,为一个字符串
  2. joined(separator:) 以给定的分隔符,拼接字符串数组里的所有元素,为一个字符串
let array = ["hello", "world"]
print(array.joined())
print(array.joined(separator: ","))
  • 元素为 Sequence 数组的拼接
  1. joined() 拼接数组里的所有元素为一个更大的 Sequence
  2. joined(separator:) 以给定的分隔符,拼接数组里的所有元素为一个更大的 Sequence
let ranges = [0...3, 8...10, 15...17]
for range in ranges {
    print(range)
}
for index in ranges.joined() { //拼接获取range 的每一个值
    print(index)
}

let nestedNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let joined = nestedNumbers.joined(separator: [-1, -2])
print(nestedNumbers)
print(Array(joined))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容