Swift 快速将数据从一个函数传递到另一个函数
我有一个小的swift应用程序,它包括3个函数Swift 快速将数据从一个函数传递到另一个函数,swift,firebase,Swift,Firebase,我有一个小的swift应用程序,它包括3个函数 getIncData(),getExpData()(从firebase获取数据并将其存储在数组中)和getLeftBudget(),它们应该从getIncData()-getExpData() 下面是我的代码的样子 var income = [Double]() var expenses = [Double]() var totalIncome: Double = 0 var totalExpenses: Double = 0 func getI
getIncData()
,getExpData()
(从firebase获取数据并将其存储在数组中)和getLeftBudget()
,它们应该从getIncData()
-getExpData()
下面是我的代码的样子
var income = [Double]()
var expenses = [Double]()
var totalIncome: Double = 0
var totalExpenses: Double = 0
func getIncData() {
let budgetDB = Database.database().reference().child("Income")
budgetDB.observe(.childAdded) { (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let value = snapshotValue["Value"]!
self.income.append(Double(Int(value)!))
self.totalIncome = self.income.reduce(0, +)
self.incomeLabel.text = "Income: " + String(self.totalIncome) + " €";
}
}
func getExpData() {
let budgetDB = Database.database().reference().child("Expenses")
budgetDB.observe(.childAdded) { (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let value = snapshotValue["Value"]!
self.expenses.append(Double(value)!)
self.totalExpenses = self.expenses.reduce(0, +)
self.expensesLabel.text = "Expenses: " + String(Double(self.totalExpenses)) + " €";
}
func getLeftBudget() {
let budgetLeft = self.totalIncome - self.totalExpenses
self.budgetMonth.text = "Budget left - \(String(budgetLeft))"
}
var收益=[Double]()
风险值费用=[双倍]()
var总收入:双倍=0
var totalExpenses:Double=0
func getIncData(){
让budgetDB=Database.Database().reference().child(“收入”)
在中观察(.childAdded){(快照)
让snapshotValue=snapshot.value为!字典
让值=快照值[“值”]!
self.income.append(Double(Int(value)!)
self.totalIncome=self.income.reduce(0,+)
self.incomeLabel.text=“收入:”+字符串(self.totalIncome)+“€”;
}
}
func getExpData(){
让budgetDB=Database.Database().reference().child(“费用”)
在中观察(.childAdded){(快照)
让snapshotValue=snapshot.value为!字典
让值=快照值[“值”]!
自我费用追加(双倍(价值)!)
self.totalExpenses=self.expenses.reduce(0,+)
self.expensesLabel.text=“费用:”+String(Double(self.totalExpenses))+“€”;
}
func getLeftBudget(){
让budgetLeft=self.totalIncome-self.totalExpenses
self.budgetMonth.text=“预算左-\(字符串(budgetLeft))”
}
现在,getLeftBudget
中的self.totalIncome
和self.totalExpenses
返回0。从函数中获取数据到第三个函数中以便进行计算的最佳方法是什么
另外,阵列将使用firebase中的数据填充,计算在
getIncData()
和getExpData()
中完成。您将使用budgetDB从异步函数中获取值。请遵守
然后,当您调用getLeftBudget
时,您还没有变量中的值。您应该实现一个完成处理函数
这段代码没有经过测试,我只是用一个记事本来适应,因为我不在办公室,但想法就是这样
var income = [Double]()
var expenses = [Double]()
var totalIncome: Double = 0
var totalExpenses: Double = 0
typealias returnCalc = (Bool) -> Void
func getIncData(completion: @escaping returnCalc) {
let budgetDB = Database.database().reference().child("Income")
budgetDB.observe(.childAdded) { (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let value = snapshotValue["Value"]!
self.income.append(Double(Int(value)!))
self.totalIncome = self.income.reduce(0, +)
self.incomeLabel.text = "Income: " + String(self.totalIncome) + " €";
completion(true)
}
}
func getExpData(completion: @escaping returnCalc) {
let budgetDB = Database.database().reference().child("Expenses")
budgetDB.observe(.childAdded) { (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let value = snapshotValue["Value"]!
self.expenses.append(Double(value)!)
self.totalExpenses = self.expenses.reduce(0, +)
self.expensesLabel.text = "Expenses: " + String(Double(self.totalExpenses)) + " €";
completion(true)
}
}
func getLeftBudget() {
getIncData { (completed) in
getExpData(completion: { (completed) in
let budgetLeft = self.totalIncome - self.totalExpenses
self.budgetMonth.text = "Budget left - \(String(budgetLeft))"
})
}
}
var收益=[Double]()
风险值费用=[双倍]()
var总收入:双倍=0
var totalExpenses:Double=0
typealias returnCalc=(Bool)->Void
func getIncData(完成:@returnCalc){
让budgetDB=Database.Database().reference().child(“收入”)
在中观察(.childAdded){(快照)
让snapshotValue=snapshot.value为!字典
让值=快照值[“值”]!
self.income.append(Double(Int(value)!)
self.totalIncome=self.income.reduce(0,+)
self.incomeLabel.text=“收入:”+字符串(self.totalIncome)+“€”;
完成(真)
}
}
func getExpData(完成:@returnCalc){
让budgetDB=Database.Database().reference().child(“费用”)
在中观察(.childAdded){(快照)
让snapshotValue=snapshot.value为!字典
让值=快照值[“值”]!
自我费用追加(双倍(价值)!)
self.totalExpenses=self.expenses.reduce(0,+)
self.expensesLabel.text=“费用:”+String(Double(self.totalExpenses))+“€”;
完成(真)
}
}
func getLeftBudget(){
getIncData{(已完成)在中
getExpData(完成:{(已完成)在中
让budgetLeft=self.totalIncome-self.totalExpenses
self.budgetMonth.text=“预算左-\(字符串(budgetLeft))”
})
}
}
您可以稍微推动完成块的使用,直接使用函数返回值,避免上下文或全局变量:
var income = [Double]()
var expenses = [Double]()
var totalIncome: Double = 0
var totalExpenses: Double = 0
typealias returnCalc = (Double) -> Void
func getIncData(completion: @escaping returnCalc) {
let budgetDB = Database.database().reference().child("Income")
budgetDB.observe(.childAdded) { (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let value = snapshotValue["Value"]!
self.income.append(Double(Int(value)!))
// self.totalIncome = self.income.reduce(0, +)
self.incomeLabel.text = "Income: " + String(self.income.reduce(0, +)) + " €";
completion(self.income.reduce(0, +))
}
}
func getExpData(completion: @escaping returnCalc) {
let budgetDB = Database.database().reference().child("Expenses")
budgetDB.observe(.childAdded) { (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let value = snapshotValue["Value"]!
self.expenses.append(Double(value)!)
// self.totalExpenses = self.expenses.reduce(0, +)
self.expensesLabel.text = "Expenses: " + String(Double(self.expenses.reduce(0, +))) + " €";
completion(self.expenses.reduce(0, +))
}
}
func getLeftBudget() {
getIncData { (inc) in
getExpData(completion: { (exp) in
let budgetLeft = inc - exp
self.budgetMonth.text = "Budget left - \(String(budgetLeft))"
})
}
}
var收益=[Double]()
风险值费用=[双倍]()
var总收入:双倍=0
var totalExpenses:Double=0
typealias returnCalc=(双精度)->Void
func getIncData(完成:@returnCalc){
让budgetDB=Database.Database().reference().child(“收入”)
在中观察(.childAdded){(快照)
让snapshotValue=snapshot.value为!字典
让值=快照值[“值”]!
self.income.append(Double(Int(value)!)
//self.totalIncome=self.income.reduce(0,+)
self.incomeLabel.text=“收入:”+String(self.Income.reduce(0,+)+“€”;
完成(自我收入减少(0,+)
}
}
func getExpData(完成:@returnCalc){
让budgetDB=Database.Database().reference().child(“费用”)
在中观察(.childAdded){(快照)
让snapshotValue=snapshot.value为!字典
让值=快照值[“值”]!
自我费用追加(双倍(价值)!)
//self.totalExpenses=self.expenses.reduce(0,+)
self.expensesLabel.text=“费用:”+String(双倍(self.Expenses.reduce(0,+)))+“€”;
完成(自我费用减少(0,+)
}
}
func getLeftBudget(){
getIncData{(inc)在
getExpData(完成:{(exp)in)
让budgetLeft=inc-exp
self.budgetMonth.text=“预算左-\(字符串(budgetLeft))”
})
}
}
代码在我看来很好。请确保按顺序调用这三个函数。谢谢,这是有道理的,我还是swift新手,但你所说的完全有道理,但现在当我调用函数getExpData()
和`getIncData()时`,我应该添加什么作为函数参数?没有什么,它将返回一个bool完成块,告诉您函数已完成。只需使用Xcode autocomplete,您就可以获得所需的一切您只需添加一个变量名(取决于您)即可从完成中接收bool值。getIncData{(无论什么)在
中。您可以将其称为输出参数。很高兴提供帮助!只需添加一个加号即可