Причина, по которой вы ничего не возвращаете, заключается в том, что db.collection().getDocuments
является асинхронной функцией . Это означает, что функция выполняет «возврат» до выполнения кода db.collection().getDocuments
.
«Возврат» предполагает, что код будет выполняться синхронно , что означает выполнение строкипо линии в предсказуемом порядке. асинхронная функция - это функция, в которой мы не знаем, когда она завершит выполнение (что всегда верно для сетевого кода).
Что если сеть не работает? Что делать, если загрузка занимает много времени? Поскольку мы не можем знать, мы используем обработчик завершения , чтобы «вернуть» то, что нам нужно после завершения функции. Другие предложения хороши, ниже другое решение. В качестве примечания предполагается, что эта функция является частью класса, и вы хотите присвоить результат внешней переменной.
class MyClass {
var myNameArray = [String]()
func functionName() {
db.collection("Names").getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
myNameArray.append("\(document.documentID)")
}
}
}
}
}
Еще одна небольшая вещь в соглашениях об именах: переменные должны использовать camelCase, поэтому nameArray
предпочтительнее NameArray
.