【问题标题】:Iterate through an optional array in Swift?遍历 Swift 中的可选数组?
【发布时间】:2017-04-25 18:09:47
【问题描述】:

我在这个项目中使用 cocoapod SQLite

import SQLite

var db = try! Connection()
var id: Expression<Int>!
var identifier: Expression<String>!

有了它,我正在读取 SQLite 数据库中的移动列表。 每个怪物都有他们可以学习的动作。有些怪物可以比其他怪物学习更多的动作。

var monster: Monster!
var monArray = [Monster]()
var dataSource: DataSource!

要获得怪物移动 ID,我使用此代码。这使我能够抓住阵列中的第一步。更改 0 将使我获得第二、第三步等。

monster.moves![0]["move_id"] as! Int

现在我使用 SQLite 数据库,因为我需要将 plist 中的怪物 ID 值与 SQLite 数据库中的值匹配。我使用此代码这样做

override func viewWillAppear(_ animated: Bool) {
    let movesArray = Array(try! db.prepare(Table("moves").where(identifier == moves.name!.lowercased())))
    for user in movesArray {
            monArray = dataSource.mons.filter{ $0.moves![0]["move_id"] as! Int == user[id] }
    }
}

一切正常直到我尝试增加索引范围。

for user in movesArray {
     for i in 0...6 {
         monArray = dataSource.mons.filter{ $0.moves![i]["move_id"] as! Int == user[id] }
     }
}

看到我在哪里将0 替换为i 范围?我这样做是因为怪物有不止一个动作,如果我把它留在0 我的应用程序只会显示学习该动作的怪物作为他们的第一个动作。为了更好地解释,我当前的代码不查看怪物是否知道这一步,它只查看怪物是否知道这一步作为它的第一步

在上面的代码中,我增加了范围,认为它可以解决我的问题,但是我的应用程序会崩溃,因为一些怪物只有 1 在他们的索引中移动,所以任何高于索引 0 的东西都会因错误而崩溃

致命错误:索引超出范围

所以回顾一下,我需要遍历整个数组而不是只遍历第一个索引,而不会崩溃。我怎样才能做到这一点?

【问题讨论】:

    标签: ios arrays swift sqlite


    【解决方案1】:

    如果没有所有的故事,你只是问如何迭代像here这样的数组

    for item in array as type {
       ...
    }
    

    【讨论】:

    • 您能否进一步详细说明这个答案?
    【解决方案2】:

    您的问题似乎更像是一个合乎逻辑的问题。如果我理解你所说的,那么每个怪物至少会有 1 步,但不保证会有更多。所以你需要考虑到这一点。

    像你这样有一个固定的限制肯定会导致问题,如果不是所有的怪物都有那么多的移动,因为数组并不总是那么大。

    我会这样做:

    let monsterMoveCount = user.moves.count
    for i in 0...monsterMoveCount
       // Do whatever logic here
    

    希望这会有所帮助!

    【讨论】:

    • 您好,谢谢!问题是范围末尾的任何大于 0 的数字都会使代码崩溃。所以使用0...monsterMoveCount会崩溃,因为monsterMoveCount大于0
    • monster.moves[0] 应该抓住阵列中的第一步正确吗?如果是这样,那么使用monster.moves[i] 应该在该索引处获取相应的移动。因此,在尝试您的过滤器逻辑之前,我会打印出每个怪物的数量,以确保它们的数量超过 1。否则,我提供的代码应该可以工作。您也可以随时尝试常规 for 循环 for int i = 0; i &lt; monsterMoveCount; i++
    • 实际上重新查看您的代码......dataSource.mons.filter{ $0.moves! .... 不会只是dataSource.filter { ...。如果你的数据源充满了怪物,那么$0 就是一个怪物对象。
    • 它的结构方式目前写得正确
    • 你会比我更清楚!我的最后一点建议是将事物提取到变量中,并确保每个组件都与您的想法完全相同。你似乎想把所有东西都变成一条线哈哈。
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多