【问题标题】:Swift reverse array not workingSwift反向数组不起作用
【发布时间】:2017-12-19 13:40:09
【问题描述】:

我尝试制作反转数组,请考虑以下:

let arrValues : [MyStruct] = 
            [MyStruct(key: "id-5"),     
             MyStruct(key: "id-10"),
             MyStruct(key: "id-20")]

let reversedKeys = arrValues.map{$0.key ?? ""}.reversed()

它应该可以工作,但在日志中我看到的键顺序与我添加它们的顺序相同。

【问题讨论】:

  • @the4kman 是的,有什么问题
  • 输出是否如下所示:ReversedRandomAccessCollection<Array<String>>(_base: ["id-5", "id-10", "id-20"])?因为这是意料之中的;您将返回一个反向的 view 到映射数组,而不是一个新的反向数组。如果你想要一个反转数组,那么说let reversedKeys: Array = arrValues.map{$0.key ?? ""}.reversed()
  • @MartinR 谢谢,已收藏
  • arrValues.reversed().map{$0.key ?? ""} 也应该产生一个数组。

标签: ios arrays swift reverse


【解决方案1】:

这是对操场的简单测试:

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"

但如果你停止执行并调试 reversedKeys 的内容,它将显示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()

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2017-10-15
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多