Похоже, ваша ошибка в том, что вы положили свое утверждение if.Он находится внутри того же места, куда вы добавляете names
, и это оператор for
.Итак, что вы делаете, вы объявляете var names = [String]()
, а затем оператор if
происходит на каждой итерации, когда имя еще не добавлено, если я правильно его понимаю.
//get the name of each user
let numberOfKeys = randomKeyArray.count
var names = [String]() //<- empty
for i in 0..<numberOfKeys {
let thisUserKey = randomKeyArray[i]
let userRef = self.ref.child("users").child(thisUserKey)
userRef.observeSingleEvent(of: .value, with: { snapshot in
let name = snapshot.childSnapshot(forPath: "fullname").value as! String
names.append(name) //<- append
self.currIds.append(thisUserKey)
//show names on buttons in realtime
if followingNum <= 3 {
self.optionA.setTitle("Follow\nat least\n4 friends!", for: .normal)
self.optionA.isEnabled = false
self.optionB.setTitle("Follow\nat least\n4 friends!", for: .normal)
self.optionB.isEnabled = false
//repeat for 2 more buttons
} else if followingNum >= 4 {
self.currNames = names
self.optionA.setTitle(names[0], for: .normal)
self.optionB.setTitle(names[1], for: .normal) //ERROR here "Thread 1: Fatal error: Index out of range" // only names[0] exists at this point.
//repeat for 2 more buttons
}
})
Таким образом, нам, вероятно, нужно сделать эту функцию, чтобы мы могли вызывать ее в нужном месте:
func showNames() {
if followingNum <= 3 {
self.optionA.setTitle("Follow\nat least\n4 friends!", for: .normal)
self.optionA.isEnabled = false
self.optionB.setTitle("Follow\nat least\n4 friends!", for: .normal)
self.optionB.isEnabled = false
//repeat for 2 more buttons
} else if followingNum >= 4 {
self.currNames = names
self.optionA.setTitle(names[0], for: .normal)
self.optionB.setTitle(names[1], for: .normal) //ERROR here "Thread 1: Fatal error: Index out of range"
//repeat for 2 more buttons
}
}
Так что это должно произойти после всех итераций для имен, так что, возможно, вызовите это здесь, только снаружии после цикла:
for i in 0..<numberOfKeys {
let thisUserKey = randomKeyArray[i]
let userRef = self.ref.child("users").child(thisUserKey)
userRef.observeSingleEvent(of: .value, with: { snapshot in
let name = snapshot.childSnapshot(forPath: "fullname").value as! String
names.append(name)
self.currIds.append(thisUserKey)
}
self.showNames()
Возможно, вам потребуется объявить followingNum
вне целого:
var followingNum = Int()
, а затем обновить его:
self.followingNum = snapshot.children.allObjects.count
В качестве альтернативы просто убедитесь, что ваш оператор if не находится внутри цикла for
.Надеюсь, что это имеет смысл, это должно решить проблему names[1]
.Надеюсь, что это имеет смысл.