在Swift中迭代一个可选数组?

时间:2017-04-25 18:09:48

标签: ios arrays swift sqlite

我正在使用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的东西都会崩溃错误

  

致命错误:索引超出范围

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

2 个答案:

答案 0 :(得分:-1)

如果没有关于如何迭代像here

这样的数组的所有故事
for item in array as type {
   ...
}

答案 1 :(得分:-2)

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

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

我会做类似的事情:

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

希望这有帮助!