我在Firebase实时数据库中有问题和答案,我需要将其下载并放入阵列。我创建了一个带参数的函数,它应该返回两个数组
let data = fetchQuestions(category: "Animals")
qAni = data.ques
aAni = data.ans
fetchQuestions方法:
func fetchQuestions(category: String) -> (ques: [String], ans: [String]) {
var q = [String]()
var a = [String]()
ref.child("QA/Category").observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? [String: Any]
for (k, v) in value! {
if k == category {
let QA = v as! NSArray
for i in QA {
let question = i as! [String: String]
q.append(question["question"]!)
a.append(question["answer"]!)
}
return (q, a) ** Unexpected non-void return value in void function
}
}
})
}
我曾尝试使用调度组,但后来收到了不同的错误。
答案 0 :(得分:2)
您目前正在observeSingleEvent
的完成区返回,其返回类型为void
,您需要使用completionHandler
创建fetchQuestions
。现在使用Swift而不是使用NSArray
使用Swift本机数组。另外,不是维护两个数组,而是使用struct或class的自定义对象维护一个数组。
首先像这样创建一个struct
。
struct Category {
let question: String
let answer: String
}
现在以这种方式使用fetchQuestions
制作completionHandler。
func fetchQuestions(category: String, completion: @escaping([Category]) -> Void) {
var array = [Category]
ref.child("QA/Category").observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? [String: Any]
for (k, v) in value! {
if k == category {
let QA = v as! [[String:String]]
for i in QA {
let que = i["question"]!
let ans = i["answer"]!
array.append(Category(question: que, answer: ans))
}
}
}
completion(array)
})
}
现在以这种方式致电fetchQuestions
。
self.fetchQuestions(category: "Animals") { categories in
//access categories here
print(categories)
}
注意:您可以使用queryEqual(toValue:)
与您的请求一起使用if
来获取特定结果,而不是查看此SO thread的详细信息。 p>
答案 1 :(得分:0)
因为你从一个闭包中返回一个值而你应该使用不同的闭包。试试吧:
func fetchQuestions(category: StringcompletionBlock:@escaping (_ ques:[String], _ ans :[String]) -> ()) {
var q = [String]()
var a = [String]()
ref.child("QA/Category").observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? [String: Any]
for (k, v) in value! {
if k == category {
let QA = v as! NSArray
for i in QA {
let question = i as! [String: String]
q.append(question["question"]!)
a.append(question["answer"]!)
}
}
return completionBlock(q,a)
}
})
}
@escaping是必需的:当闭包作为参数传递给。时 函数,但在函数返回后调用。