arrays - 我应该如何获取作为 Int 通过测试的对象的最后一个索引?

标签 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)

让 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/

相关文章:

objective-c - 如何检测 UICollectionView 中最后一个或第一个单元格的滑动

swift - 如果字符串中存在数字,则仅删除起始 3 数字的正则表达式

PHP 数组唯一值

javascript - VueJS : Filter through objects in an array

java - 在数据库中插入一个字符数组

node.js - 我想在 swift 上使用 alamofire 来使用登录 API (nodejs)

php - 如何从数组中获取所有最接近的匹配字符串?

php - 在 php 中更改具有特定子键值的数组键值

ios - 使用dispatch_time定期执行任务

ios - UINavigationController 在键盘出现崩溃时隐藏栏应用程序 (SWIFT)