iOS:Swift 数组、字典、集合

数组(Array)是有序数据集。

集合(Set)是无序且无重复数据集。

字典(Dictionary)是无序键值对的集。

注意: Swift 的 Array、Set 和 Dictionary 类型被实现为泛型集合

数组

简单创建

var beatles = ["John", "Paul", "George", "Ringo"]
let numbers = [4, 8, 15, 16, 23, 42]
var temperatures = [25.3, 28.2, 26.4]

let 创建的是不可变数组

var 创建的是可变数组

数据读取

print(beatles[0])
print(numbers[1])
print(temperatures[2])

输出:
John
8
26.4

注意:使用索引读取数据时,必须保证索引处存在,否则崩溃

数据添加

beatles.append("Allen")
beatles.append("Adrian")

注意:数组内只能包含一种类型的数组

temperatures.append("Chris")是不允许的。

明确类型的创建

var scores = Array<Int>() 或 var scores = [Int]() 均可
scores.append(100)
scores.append(80)
scores.append(85)
print(scores[1])

简单函数使用

var characters = ["Lana", "Pam", "Ray", "Sterling"]
// 数组长度
print(characters.count)

// 移除指定位置的元素
characters.remove(at: 2)
print(characters.count)

// 移除全部
characters.removeAll()
print(characters.count)

// 是否包含
print(characters.contains("Frozen"))

高阶函数使用

排序

可以在sorted内根据需求实现排序规则

// 基本数据类型排序
let cities = ["London", "Tokyo", "Rome", "Budapest"]
print(cities.sorted())

输出:
["Budapest", "London", "Rome", "Tokyo"]

自定义类排序
struct HFModel {
    var testAge: Int
}
let models = [HFModel(testAge: 10), HFModel(testAge: 30), HFModel(testAge: 90)]
let sortedModels = models.sorted{ m1, m2 in
    return m1.testAge > m2.testAge
}
/**
  [SwiftEnumDemo.HFModel(testAge: 90),
 SwiftEnumDemo.HFModel(testAge: 30), SwiftEnumDemo.HFModel(testAge: 10)]
*/
print(sortedModels)

数组的遍历

let presidents = ["Bush", "Obama", "Trump", "Biden"]
for item in presidents {
    print(item)
}

// 需要每个数据项的值和索引值,可以使用enumerated()方法来进行数组遍历
for (index, value) in presidents.enumerated() {
   print("Item \(String(index + 1)): \(value)")
}

// 遍历数组,但是不包括第一个元素
/**
 Obama
 Trump
 Biden
 */
for item in presidents.dropFirst(){
    print(item)
}
print("- - - - - - -")
// 遍历数组,但是不包括最后一个或几个元素
/**
 Bush
 Obama
 Trump
 */
for item in presidents.dropLast(){
    print(item)
}
print("- - - - - - -")

// 遍历数组,但是不包括最后一个或几个元素
/**
 Bush
 Obama
 */
for item in presidents.dropLast(2){
    print(item)
}

反转数组

let presidents = ["Bush", "Obama", "Trump", "Biden"]
print(presidents)

let reversedPresidents = Array(presidents.reversed())
print(reversedPresidents)

输出:
["Bush", "Obama", "Trump", "Biden"]
["Biden", "Trump", "Obama", "Bush"]

map函数

遍历数组中的元素,传入到后面的闭包里面,闭包的返回值组成新的数组,最后返回这个新数组。

var arr = [1, 2, 3, 4]
// [2, 4, 6, 8]
var arr2 = arr.map { $0 * 2 }

func double(_ i: Int) -> Int { i * 4 }
// [4, 8, 12, 16]
var arr3 = arr.map(double)

可以直接在闭包内添加操作逻辑,也可以直接传入一个函数

flatMap函数

若是一维数组,用法和map基本类似

但若是二维数组,就大不相同。

var arr = [[6,3,1,9], [2, 3, 4]]
// [[12, 6, 2, 18], [4, 6, 8]]
var arr2 = arr.map { $0.map{ $0*2 } }
print(arr2)
// [12, 6, 2, 18, 4, 6, 8]
var arrflat2 = arr.flatMap { $0.map{ $0*2 } }
print(arrflat2)

compactMap函数

compactMap会将数组中的元素解包,如果是nil就清除这个元素,最后返回新数组。

let possibleNumbers = ["1", "2", "three", "///4///", "5"]
// [Optional(1), Optional(2), nil, nil, Optional(5)]
let mapped: [Int?] = possibleNumbers.map { Int($0)  }
print(mapped)

// [1, 2, 5]
let compactMapped: [Int] = possibleNumbers.compactMap { Int($0)  }
print(compactMapped)

Filter函数

遍历数组中的元素,元素根据闭包内的条件过滤

var arr = [1, 2, 3, 4]
// 过滤后为 [2, 4]
var arr2 = arr.filter { $0 % 2 == 0 }
print(arr2)

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
// 过滤后为 ["Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
print(shortNames)

reduce函数

用于遍历集合类型对象来进行求值,或构造一个新集合类型对象等。

对数组求和
let sizes = [1,2,3,4,5,6,7]
let totalSum = sizes.reduce(0, {$0 + $1})
// 28
print(totalSum)

备注:
//  单纯的累加/乘操作还可以如下实现
let totalSum = sizes.reduce(0, +)
求数组最值
llet nums = [12, 56, -9, 100, 34]
// 求最小值
let minNum = nums.reduce(Int.max) {num1 , num2 in
    return min(num1, num2)
}
// -9
print(minNum)

// 求最大值
let maxNum = nums.reduce(Int.min) {num1 , num2 in
    return max(num1, num2)
}
// 100
print(maxNum)
构建新集合类型对象
let models = [HFModel(name: "one" ,testAge: 10), HFModel(name: "two" ,testAge: 30), HFModel(name: "three" ,testAge: 90)]

print(models)
let infoMap = models.reduce(into: [String: Int]()) {result,model in
    result[model.name] = model.testAge
}
// ["two": 30, "one": 10, "three": 90]
print(infoMap)

字典

简单创建

let employee2 = [
    "name": "Taylor Swift",
    "job": "Singer", 
    "location": "Nashville"
]

或
var heights = [String: Int]()
heights["Yao Ming"] = 229
heights["Shaquille O'Neal"] = 216
heights["LeBron James"] = 206

或
var archEnemies = [String: String]()
archEnemies["Batman"] = "The Joker"
archEnemies["Superman"] = "Lex Luthor"

高阶函数调用和参考上述数组中的描述

集合

简单创建

let people = Set(["Denzel Washington", "Tom Cruise", "Nicolas Cage", "Samuel L Jackson"])

或
var people = Set<String>()
people.insert("Denzel Washington")
people.insert("Tom Cruise")
people.insert("Nicolas Cage")
people.insert("Samuel L Jackson")

部分函数使用

1 使用intersection(_:)方法,根据两个集合中都包含的值创建的一个新的集合。

2 使用symmetricDifference(_:)方法,根据在一个集合中但不在两个集合中的值创建一个新的集合。

3 使用union(_:)方法,根据两个集合的值创建一个新的集合。

4 使用subtracting(_:)方法,根据不在该集合中的值创建一个新的集合。

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
oddDigits.union(evenDigits).sorted()

// []
oddDigits.intersection(evenDigits).sorted()

// [1, 9]
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()

// [1, 2, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()

1 使用“是否相等”运算符(==)来判断两个集合是否包含全部相同的值。

2 使用isSubset(of:)方法来判断一个集合中的值是否也被包含在另外一个集合中。

3 使用isSuperset(of:)方法来判断一个集合中包含另一个集合中所有的值。

4 使用isStrictSubset(of:)或者isStrictSuperset(of:)方法来判断一个集合是否是另外一个集合的子集合或者。父集合并且两个集合并不相等。

5 使用isDisjoint(with:)方法来判断两个集合是否不含有相同的值(是否没有交集)。

let a: Set = ["1","2","3","4","5","6"]
let b: Set = ["1","2"]
let c: Set = ["7"]
 
b.isSubset(of: a)  // true
a.isSuperset(of: b) // true
a.isDisjoint(with: c) // true

Set用于无序的唯一对象,Array是有序的并且可以包含重复数据
Array迭代速度比Set快,Set搜索速度比Array快

更多高阶函数调用和参考上述数组中的描述

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容