我如何使用完成处理程序将值传递给另一个 View Controller

How could I pass value to another View Controller using completion handler

你好,我是 Swift 的新人,我有一个问题。我有配料价目表,存储在 Cloud Firestore 中。我想计算特定收据的价格并将其传递给另一个VC,所以我写了这段代码:

extension RecepiesViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        func recepieCalculation(_ completion: @escaping (Double) ->()) {
            var totalPrice = 0.0
            for ingridients in cakeRecepies![indexPath.item].ingridientList {
                db.collection("Okey")
                    .document(ingridients.name)
                    .getDocument() { (document, error) in
                        if let document = document, document.exists {
                            let data = document.data()
                            if let price = data!["price"] as? Double, let count = data!["count"] as? Int  {
                                let priceForOne = price / Double(count)
                                totalPrice = totalPrice + priceForOne * Double(ingridients.count)
                            }
                        } else {
                            print("Document does not exist")
                        }
                        completion(totalPrice)       
                }

            }
        }
        recepieCalculation {totalPrice in
            func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                let destinationVC = segue.destination as! ResultViewController
                destinationVC.result = totalPrice
            }
            self.performSegue(withIdentifier: "goToResult", sender: self)
        }   
    }
}

第二个 VC 代码:

class ResultViewController: UIViewController {
    var result: Double? {
        didSet {
            print(result)
        }
    }
    @IBOutlet weak var recepieImage: UIImageView!
    override func viewDidLoad() {   
    }
}

但是控制台中没有打印任何内容。有什么问题吗?

得到

 func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      let destinationVC = segue.destination as! ResultViewController
      destinationVC.result = totalPrice
 }

出完成

extension RecepiesViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
        recepieCalculation {totalPrice in
            self.performSegue(withIdentifier: "goToResult", sender: self)
        }   
    }
    func recepieCalculation(_ completion: @escaping (Double) ->()) {
        var totalPrice = 0.0
        for ingridients in cakeRecepies![indexPath.item].ingridientList {
            db.collection("Okey")
                .document(ingridients.name)
                .getDocument() { (document, error) in
                    if let document = document, document.exists {
                        let data = document.data()
                        if let price = data!["price"] as? Double, let count = data!["count"] as? Int  {
                            let priceForOne = price / Double(count)
                            totalPrice = totalPrice + priceForOne * Double(ingridients.count)
                        }
                    } else {
                        print("Document does not exist")
                    }
                    completion(totalPrice)       
            }

        }
    }
    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destinationVC = segue.destination as! ResultViewController
        destinationVC.result = totalPrice
    }
}