Swift 快速将数据从一个函数传递到另一个函数

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

我有一个小的swift应用程序,它包括3个函数

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{(无论什么)在
中。您可以将其称为输出参数。很高兴提供帮助!只需添加一个加号即可