Swift基础 - Array、Tuple、Set及高阶函数

89 阅读3分钟

本文章内容基于Swift5。

一、Array

初始化

// []
let intEmptyArray = [Int]()

// [1.0, 1.0, 1.0]
let doubleArray = Array(repeating: 1.0, count: 3)
print(doubleArray)

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let intArray = Array(0 ... 10)
print(intArray)

添加

var numbers = [1, 2, 3]
var addNumbers = [4, 5, 6]

// [1, 2, 3, 11]
numbers.append(11)
print(numbers)

// [1, 2, 3, 11, 4, 5, 6]
numbers.append(contentsOf: addNumbers)
print(numbers)

// [1, 2, 3, 11, 4, 5, 6, 7, 8]
numbers += [7, 8]
print(numbers)

// [99, 1, 2, 3, 11, 4, 5, 6, 7, 8]
numbers.insert(99, at: 0)
print(numbers)

替换

// [99, 10, 2, 3, 11, 4, 5, 6, 7, 8]
numbers[1] = 10
print(numbers)

查找

print("有6吗? 结果:\(numbers.contains(6))")    // 有6吗? 结果:true
// 获取指定范围内元素
let number6 = [1, 22, 31, 10, 4]
print(number6.prefix(upTo: 2))     // 前2个元素     [1, 22]
print(number6.suffix(from: 1))     // from到结尾    [22, 31, 10, 4]

删除

// 删除最后一位
// [99, 10, 2, 3, 11, 4, 5, 6, 7]
numbers.removeLast()
print(numbers)

// 删除指定位置
// [99, 2, 3, 11, 4, 5, 6, 7]
numbers.remove(at: 1)
print(numbers)

// 全部删除
numbers.removeAll()

迭代

for i in 0 ..< 10 {
    // 0到9
}

for i in 0 ... 10 {
    // 0到10
}

for i in (0 ..< 10).reversed() {
    // 反向遍历
}

for num in numbers {
    // 迭代数组
    print(num)
}
var dropNumbers = [1, 2, 3, 4, 5]
for num in dropNumbers.dropFirst() {
    // 除了第一个元素外的数组其余部分
    print("dropFirst \(num)")
    
    //    dropFirst 2
    //    dropFirst 3
    //    dropFirst 4
    //    dropFirst 5
}

print(dropNumbers.dropFirst(3))  // [4, 5]
print(dropNumbers.dropLast(3))   // [1, 2]
let number2 = ["a", "b", "c", "d", "e", "f"]
// 列举 元素 和 下标
for (index, element) in zip(number2.indices, number2) {
    print("index: \(index), element:\(element)")
}
// index: 0, element:a
// index: 1, element:b
// index: 2, element:c
// index: 3, element:d
// index: 4, element:e
// index: 5, element:f
// 同时遍历索引和元素
let number2 = ["a", "b", "c", "d", "e", "f"]
for (index, num) in number2.enumerated() {
    print("\(index): \(num)")
//    0: a
//    1: b
//    2: c
//    3: d
//    4: e
//    5: f
}
// 倒序循环 10~5
for num in stride(from: 10, to: 5, by: -1) {
    print(num)
//    10
//    9
//    8
//    7
//    6
}
// 数组的索引:["a", "b", "c", "d", "e", "f"]
print("数组的索引:\(number2[number2.startIndex ..< number2.endIndex])")

高阶函数

Filter

firstIndex(where predicate: (Element) throws -> Bool) rethrows -> Int?

// 查找某一元素的位置
if let idx = number2.firstIndex(where: { $0 == "d" }) {
    // 找到了: 3
    print("找到了: \(idx)")
}

filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]

let number3 = [2, 4, 6, 8, 10]
let filter = number3.filter { $0 > 5 }
print(filter)         // [6, 8, 10]
let number4 = ["Aa1", "Bak", "66Z2", "Po2"]
let array = number4.filter { str -> Bool in
    str.contains("2")
}
// ["66Z2", "Po2"]
print(array)
Map

map(_ transform: (Element) throws -> T) rethrows -> [T]

map 将于拿来数组元素映射到新数组中:映射数组,转换元素

let number5 = ["a", "b", "c"]
let mapArray1 = number5.map { num -> String in
    "\(num)A"
}
// "aA", "bA", "cA"]
print(mapArray1)
let mapArray2 = (1 ... 3).map { $0 * 3 }
// [3, 6, 9]
print(mapArray2)
CompactMap

compactMap 去掉数组中的nil元素

let mapArray3 = [1, 2, 3, nil].compactMap { $0 }
// [1, 2, 3]
print(mapArray3)

compactMap 强制解包

let mapArray4: [String?] = ["1", "2", "3"]

print("map: \(mapArray4.map { $0 })")
// map: [Optional("1"), Optional("2"), Optional("3")]

print("compactMap: \(mapArray4.compactMap { $0 })")
// compactMap: ["1", "2", "3"]
Reduce

reduce 把数组变成一个元素

let reduceArray = (1 ... 5).reduce(0, +)
print(reduceArray)     // 15
let numbers = [1, 2, 3, 4]
let reduceArray = numbers.reduce("sss") { a1, a2 -> String in
    "\(a1)" + "\(a2)"
}
print(reduceArray)    // sss1234

二、Tuple

元组的使用

var boy = ("Nick", 20, 180.5)
print("Tuple, boy: \(boy)")        
// 打印:Tuple, boy: ("Nick", 20, 180.5)

print("Name: \(boy.0), age: \(boy.1), height: \(boy.2)cm")
// 打印:Name: Nick, age: 20, height: 180.5cm

// 修改
boy.1 = 21
print("Modify, age: \(boy.1)")     
// 打印:Modify, age: 21

let teacher = (name: "LiLei", city: "Beijing", tel: "13211228888")
print("Teacher name: \(teacher.name), city: \(teacher.city), tel: \(teacher.tel)")
// 打印:Teacher name: LiLei, city: Beijing, tel: 13211228888

三、Set

集合的使用

// 求 一个集合求另一个集合的补集  setA-setB
let setA: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB: Set = ["Gg", "Vv", "Aa", "Cc", "Ll", "Dd"]
let setC = setA.subtracting(setB)
print(setC)         // ["Bb"]

// 求 两个集合的交集
let setA1: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB1: Set = ["Gg", "Vv", "Aa", "Cc", "Ll", "Dd"]
let setC1 = setA1.intersection(setB1)
print(setC1)        // ["Aa", "Dd", "Cc"]

// 不包含公共的 两个集合的所有元素
let setA2: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB2: Set = ["Gg", "Vv", "Aa", "Cc", "Ll", "Dd"]
let setC2 = setA2.symmetricDifference(setB2)
print(setC2)        // ["Ll", "Vv", "Bb", "Gg"]

// 检查是否是子集
let setA3: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB3: Set = ["Aa", "Bb", "Cc", "Dd", "Ll", "Dd"]
print(setA3.isSubset(of: setB3))

四、总结

在Swift中,数组(Array)和元组(Tuple)都是用来存储一组值的集合,但它们在使用上有明显区别;

数组:适合存储一组同类型的可变数据。

元组:适合临时存储一组不同类型的固定数据,尤其在函数中用于返回多个值。

集合:适合存储一组唯一的无序数据,适合需要快速查找和集合操作的场景。