2017-08-05 37 views
0

我試過很多方法從現有數組中隨機生成一個數組。而其中的一個終於摸索出了我:隨機生成的數組只能在按鈕上工作

extension Array { 
    mutating func shuffle() { 
// get data from my FireBase and calculate amount of items in it 
     var ref: DatabaseReference? 
     var databaseHandle: DatabaseHandle? 
     var words = [lWord]() 
     ref = Database.database().reference() 
      guard let uid = Auth.auth().currentUser?.uid else { 
       print ("smt wrong with user uid") 
       return 
      } 
      databaseHandle = ref?.child("Users").child(uid).child("LearningNow").observe(.value, with: { (snapshot) in 
       var newItems: [lWord] = [] 
       for item in snapshot.children { 
        let wordItem = lWord(snapshot: item as! DataSnapshot) 
        newItems.append(wordItem) 
       } 
       words = newItems 
      }) 
     let count = words.count + 1 
     for _ in 0..<count { 
      sort { (_,_) in arc4random() < arc4random() } 
     } 
    } 
} 

但是,由於種種原因,該代碼的工作只有當我把這個方法陣列上的按鈕操作的內部,例如:

@IBAction func generate(_ sender: UIButton) { 
    words.shuffle() 
    print (words) 
} 

如果在viewDidLoad中輸入完全相同的代碼,則不會進行排序。那麼我怎樣才能排序我的陣列沒有任何行動?

P.S.如果你不知道答案,你可以推薦任何其他的方法來產生隨機數組。謝謝!

+0

你沒有看到''smt用戶uid錯誤''打印輸出,是嗎? – dasblinkenlight

+0

不,我不知道。 Firebase正常工作 –

+0

最可能的問題是'viewDidLoad'中執行的更改被稍後執行的代碼覆蓋。看看是否將相同的代碼放入'viewWillAppear'中可以解決問題。 – dasblinkenlight

回答

0

謝謝你的回覆!我找到了解決辦法,我不得不更換我的方法(代碼爲this問題):

extension Array { 
/// Returns an array containing this sequence shuffled 
var shuffled: Array { 
    var elements = self 
    return elements.shuffle() 
} 
/// Shuffles this sequence in place 
@discardableResult 
mutating func shuffle() -> Array { 
    indices.dropLast().forEach { 
     guard case let index = Int(arc4random_uniform(UInt32(count - $0))) + $0, index != $0 else { return } 
     swap(&self[$0], &self[index]) 
    } 
    return self 
} 
var chooseOne: Element { return self[Int(arc4random_uniform(UInt32(count)))] } 
func choose(_ n: Int) -> Array { return Array(shuffled.prefix(n)) } 
} 

正如你所看到的,我不爲這種做法檢索火力地堡數據。所以,也許問題出在那裏。