我试图获取通过测试的消息数组中最后一个对象的索引。
这是我到目前为止所做的事情。我有一系列消息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。
非常感谢。
答案 0 :(得分:3)
索引只能与其所属的集合一起使用。
在您的情况下,lastStatusUpdateIndex
(ReversedRandomAccessIndex
)只能与集合一起使用
由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.base
是Int
:
if let lastStatusUpdateIndex = (messages.reversed().index { message in
message % 3 == 0 } ) {
let pos = lastStatusUpdateIndex.base - 1
print(pos) // 9
}