Ios 在Swift中迭代可选数组?

Ios 在Swift中迭代可选数组?,ios,arrays,swift,sqlite,Ios,Arrays,Swift,Sqlite,我在这个项目中使用cocoapod SQLite,就像这样 import SQLite var db = try! Connection() var id: Expression<Int>! var identifier: Expression<String>! 为了得到怪物的移动ID,我使用这个代码。这让我可以抓住阵法中的第一步。更改0将使我获得第二步、第三步等 monster.moves![0]["move_id"] as! Int 现在我正在使用SQLite数

我在这个项目中使用cocoapod SQLite,就像这样

import SQLite

var db = try! Connection()
var id: Expression<Int>!
var identifier: Expression<String>!
为了得到怪物的移动ID,我使用这个代码。这让我可以抓住阵法中的第一步。更改0将使我获得第二步、第三步等

monster.moves![0]["move_id"] as! Int
现在我正在使用SQLite数据库,因为我需要将plist中的monster 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] }
     }
}
看到我在哪里用范围I替换0了吗?我之所以这么做是因为怪物有不止一个招式,如果我将其设置为0,我的应用程序将只显示学习该招式的怪物作为他们的第一个招式。为了更好地解释,我当前的代码没有检查怪物是否知道移动,它只检查怪物是否知道移动是它的第一步

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

致命错误:索引超出范围


总而言之,我需要遍历整个数组,而不仅仅是第一个索引,而不会崩溃。我怎样才能做到这一点呢?

如果你不想知道如何迭代一个数组,比如


你的问题似乎更符合逻辑。如果我理解你所说的,那么每个怪物至少会有一次移动,但不能保证会有更多。所以你需要对此做出解释

如果不是所有的怪物都有那么多的招式,那么像你这样有一个固定的限制肯定会导致问题,因为阵型并不总是那么大

我会这样做:

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

希望这有帮助

嗨,谢谢!问题是,范围末尾大于0的任何数字都会使代码崩溃。所以使用0…monsterMoveCount会崩溃,因为monsterMoveCount大于0。移动[0]应该抓住数组中的第一个移动,对吗?如果是这样,那么使用monster.moves[i]应该在该索引处获取相应的移动。所以在尝试你的过滤逻辑之前,我会打印出每个怪物的计数,以确保它们的数量超过1。否则,我提供的代码应该可以工作。对于int i=0,您也可以尝试常规for循环;我数数;我++实际上正在重新阅读您的代码。。。。dataSource.mons.filter{$0.moves!…它不就是dataSource.filter吗{….如果你的数据源中充满了怪物,那么$0就是怪物对象。它的结构是正确的,目前写出来的。你比我更清楚!我的最后一点建议就是把东西拉到变量中,确保每个组件都与你想象的完全一样。你似乎在试图将所有东西都变成一个一个的呃哈哈,你能再详细说明一下这个答案吗??
for item in array as type {
   ...
}
let monsterMoveCount = user.moves.count
for i in 0...monsterMoveCount
   // Do whatever logic here