我尝试制作反向阵列,请考虑以下内容:
let arrValues : [MyStruct] =
[MyStruct(key: "id-5"),
MyStruct(key: "id-10"),
MyStruct(key: "id-20")]
let reversedKeys = arrValues.map{$0.key ?? ""}.reversed()
它假设工作,但在日志中我看到按照相同的顺序键我添加它们。
那么这是一个简单的操场测试:
import UIKit
struct MyStruct {
var key: String?
}
let arrValues : [MyStruct] = [MyStruct(key: "id-5"), MyStruct(key: "id-10"), MyStruct(key: "id-20")]
let reversedKeys = arrValues.map{$0.key ?? ""}.reversed()
for key in reversedKeys {
debugPrint(key)
}
debugPrint将正确显示:"id-20" "id-10" "id-5"
但是如果你停止执行并调试reverseKeys的内容,它将显示id-5 id-10 id-20
reverse()
和reversed()
有两个功能。
reversed()
实际上并没有重新排序数组。它只返回一个对象(如迭代器),它将元素从结尾迭代到开始。它的复杂度为O(1)。
然而,reverse()
改变了元素的顺序,O(n)的复杂性。但它必须是一个可变数组,因为它是一个变异函数,所以按照这个例子你需要做这样的事情:
var mutableCopy = arrValues
mutableCopy.reverse()
let reverseKeys = mutableCopy.map{$0.key ?? ""}
for key in reverseKeys {
debugPrint(key)
}
如果你只需要迭代键使用reversed()
,但如果你必须使用像reverseKeys[2]
这样的下标访问键,那么你应该使用reverse()