我应该如何获得将测试作为Int传递的对象的最后一个索引?

时间:2017-05-24 15:24:02

标签: arrays swift

我试图获取通过测试的消息数组中最后一个对象的索引。

这是我到目前为止所做的事情。我有一系列消息Dictionary对象:[[String:Any]]

我得到了最后一个对象的索引:

let lastStatusUpdateIndex = messages.reversed().index { message in
    guard let type = message["type"] as? String else { return false }
    guard type == "Status Change" else { return false }
    return true
}

为了获得索引的整数,我期待着做任何一个

let position = messages.startIndex.distance(to: lastStatusUpdateIndex)

let position = messages.distance(from: messages.startIndex, to: lastStatusUpdateIndex)

但是这些方法需要Int或两个Ints(分别)

这样做的正确方法是什么? (我知道索引将来自数组的末尾而不是开头,但我可以处理它)

我使用的是Swift 3.1。

非常感谢。

1 个答案:

答案 0 :(得分:3)

索引只能与其所属的集合一起使用。 在您的情况下,lastStatusUpdateIndexReversedRandomAccessIndex)只能与集合一起使用 由messages.reversed()返回(ReversedRandomAccessCollection)。

因此,您可以计算lastStatusUpdateIndex的距离 反向集合的startIndex,即Int

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

let revMessages = messages.reversed() // a ReversedRandomAccessCollection
if let lastStatusUpdateIndex = (revMessages.index { message in
    message % 3 == 0 } ) {

    let pos = revMessages.distance(from: revMessages.startIndex,
                                   to: lastStatusUpdateIndex)
    print(pos) // 1
}

或者,使用ReversedRandomAccessIndex 有一个base属性,它是之后的位置 它在底层集合中的相应位置。 (这是错误的 在Swift 3中有记录,但已针对Swift 4修复, 比较SR-3650 - Transforming an index from a reversed() array is off by one。)

在您的情况下,基础集合是Array,所以 lastStatusUpdateIndex.baseInt

if let lastStatusUpdateIndex = (messages.reversed().index { message in
    message % 3 == 0 } ) {

    let pos = lastStatusUpdateIndex.base -  1
    print(pos) // 9
}