2017-04-25 66 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