从这篇文章,你将学习到如何使用 Swift 三种集合类型之一的数组,让我们开始吧。

Swift Arrays

可变和不可变

有 Objective-C 编程经验的朋友都知道有 NSMutableArray 和 NSArray,一个可变,另一个不可变,Swift 中语法很简化,用 var 就是变量,因此可变,可以增删改数组中的元素,用 let 就是常量,因此不可变,数组的长度和内容都不能改变。

创建数组

创建空数组

let numbers = [Int]()
let strings = [String]()

通过默认值来创建

var threeDoubles = [Double](repeating: 0.0, count: 3)

通过数组语义来创建

let evenNumbers = [2, 4, 6, 8]
var shoppingList = ["Eggs", "Milk"]

访问数组元素

var shoppingList = ["Eggs", "Milk", "Bread"]

// 检查是否为空数组
if shoppingList.isEmpty {
  print("Empty List")
}

// 检测有多少个数组元素
if shoppingList.count < 5 {
  print("Not Enough")
}

// 访问最后一个元素
print(shoppingList.first ?? "")
// 访问第一个元素
print(shoppingList.last ?? "")
// 通过下标来访问第二元素
print(shoppingList[1])
// 通过区间来访问第二个到第三个元素
print(shoppingList[1...2])


var numbers = [3, 1, 8]

// 访问值最小的元素
print(numbers.min() ?? 0)
// 访问值最大的元素
print(numbers.max() ?? 0)

操作数组元素

var shoppingList = ["Eggs", "Milk"]

// 末尾追加元素
shoppingList.append("Bread")
shoppingList += ["Banana"]

// 插入元素
shoppingList.insert("Avocado", at: 0)

// 删除元素
shoppingList.removeLast()
shoppingList.removeFirst()
shoppingList.remove(at: 1)

// 修改元素
shoppingList[1] = "Pecan"
shoppingList[0...1] = ["Grape", "Pear"]

遍历数组

var shoppingList = ["Eggs", "Milk", "Bread"]

// 不需要下标的遍历
for item in shoppingList {
  print("I want to buy \(item)")
}

// 需要下标的遍历
for (index, item) in shoppingList.enumerated() {
  print("\(index). \(item)")
}

函数式操作

reduce 利用第一个参数做为初始值,通过第二个参数做为计算方法来累计每一次运算的结果。

var scores = [2, 3, 5]

// 函数式计算总和
var total = scores.reduce(0, +)

// 等价于下面的计算
var sum = 0
for score in scores {
  sum += score
}

filter 利用块中的运算结果做为依据过滤数组元素,为真就不会过滤掉,最终将剩下的元素做为新数组返回。

var scores = [2, 7, 10]

// 函数式计算总和
var finals = scores.filter({ $0 >= 5 })

// 等价于下面的计算
var rests = [Int]()
for score in scores {
  if score >= 5 {
    rests.append(score)
  }
}

map 利用块中的运算结果做为新数组中的元素,意思就是元素一一映射成为新数组。

var scores = [2, 7, 10]

// 函数式计算总和
var newScores = scores.map({ $0 - 1 })

// 等价于下面的计算
var freshScores = [Int]()
for score in scores {
  freshScores.append(score - 1)
}

废话一句,玩过 Ruby 同学应该很有印象吧,函数式操作数组是不是很简洁。