2017-04-25 140 views
0

我使用SQLite的cocoapod这个项目像这样在Swift中遍历可选数组?

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数据库中的怪物ID值匹配。我用这个代码,这样做

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将错误

fatal error: Index out of range

崩溃

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

回答

-1

没有所有的故事,以防万一你只是询问如何遍历数组像here

for item in array as type { 
    ... 
} 
+0

请您详细解释一下这个答案吗? – baxu

-2

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

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

我会做这样的事情:

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

希望这有助于!

+1

嗨,谢谢!问题是大于0的范围末尾的任何数字都会导致代码崩溃。所以使用'0 ... monsterMoveCount'会因为'monsterMoveCount'大于0而崩溃 – baxu

+0

'monster.moves [0]'应该抓住数组中的第一步正确吗?如果是这样,那么使用'monster.moves [i]'应该抓住该索引处的相应移动。因此,在尝试使用过滤器逻辑之前,我会打印出每个怪物的数量,以确保它们超过1个。否则,我提供的代码应该可以工作。 您可以随时尝试常规循环以及 '对于int i = 0;我 jnewkirk

+0

其实在看你的代码.... 'dataSource.mons.filter {$ 0.moves! ....'不就是'dataSource.filter {...'。如果你的数据源充满怪物而不是'$ 0',那么怪物就是怪物。 – jnewkirk