我正在尝试获取通过测试的消息数组中最后一个对象的索引。
这是我目前正在做的事情。我有一组消息 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)
或
让 position = messages.distance(from: messages.startIndex, to: lastStatusUpdateIndex)
但是这些方法接受一个 Int 或两个 Int(分别)
正确的做法是什么? (我知道索引将来自数组的末尾而不是开头,但我可以处理)
我正在使用 Swift 3.1。
非常感谢。
最佳答案
索引只能用于它所属的集合。
在您的情况下,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
属性,它是 after 的位置
它在基础集合中的相应位置。 (这是错误的
在 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
}
关于arrays - 我应该如何获取作为 Int 通过测试的对象的最后一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44162604/