//: [Previous](@previous)
import Foundation
var players = ["Alice", "Bob", "Cindy", "Dan"]
// ----------------------
// | Iterating By forin |
// ----------------------
//都是基于Sequence实现的
//⓵ 当您需要对数组的所有元素执行操作时,请使用for-in循环遍历数组的内容。
players.insert("Donna", at: 4)//forin本质是enumerated()
for player in players {
print(player)
}
// ------------------------
// | Iterating By indices |indices获取数组索引区间(使用没enumerated方便,不推荐)
// ------------------------
for i in players.indices {//0..<players.count/endIndex
print("Iterating By " + players[i])
}
// ------------------------
// | Iterating By Methods |EnumeratedSequence(得到索引和具体值)
// ------------------------
//如果同时需要每个数据项的值和索引值(迭代过程中可以用where分句进行筛选),可以使用 enumerated() 方法来进行数组遍历【Set使用zip进行遍历】。如果对单个元素或者某段元素进行索引或者求值,可以使用上面2⃣️④ 的方法。
for (index, player) in players.enumerated() where index%2 == 0 {
print("~~\(index + 1). \(player)")
}
// ------------------------
// | Iterating By Methods |Sequence
// ------------------------
//playIterator迭代器
var playIterator = players.makeIterator()
while let play = playIterator.next() {
print(play)
}
// ------------------------
// | Iterating By Methods |Collection
// ------------------------
//⓶ ⭐️函数遍历 通过Collection(Sequence)、RangeReplaceableCollection协议的遍历和下标包装方法进行nomutating切片查找(返回Subsequence类型)。
// 遍历对数组进行类型转换(碾平)修改或者单纯遍历(不作运算或其他操作)、运算修改。除了filter是RangeReplaceableCollection(筛选遍历用filter)。
let fibs = [0, 1, 1, 2, 3, 5]
fibs.forEach { fib in//这个方法只作为一系列遍历函数的链式操作时插入forEach进行调式打印或作为一个简洁的链式操作时非常好(和操作数组有关时但不修改数组,只是用到数组元素)【函数式编程】。
if fib == 0 {
return//return只能跳出一次循环,该方法没有返回值(只能return)
}
print(fib)//无法使用break,continue,否则用forin循环
}
var squares = fibs.map { fib in fib * fib }
var filters = fibs.filter { (fib) -> Bool in
fib >= 2//RangeReplaceableCollection
}
let possibleNumbers = ["1", "2", "three", "///4///", "5"]
//Collection flatMap已经遗弃了,compactMap是内部碾平操作
let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
// [1, 2, nil, nil, 5]
let flatMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
// [1, 2, 5]
//这几个不算遍历但是写出来。集合获取(内部通过下标方法)数组切片(Subsequence)的方法,本质通过下标运算得到切片。没有mutating。即SubSequence != Self(nomutating)
var alternate = fibs.dropLast()
fibs.prefix(2)
fibs.suffix(2)
// ----------------------------
// | Iterating by lazy Method |LazySequence
// ----------------------------
let data = 1...3
let result = data.lazy.map { (i: Int) -> Int in
print("正在处理");//data.map 可以对比观察。lazy属性必须时可变的,API内部就是var的。处理的数据不要求可变不可变。
return i * 2
}
//: [Next](@next)
网友评论