Swift 获取函数外部的let值

Swift 获取函数外部的let值,swift,firebase,firebase-realtime-database,let,Swift,Firebase,Firebase Realtime Database,Let,您好,我是swift编程新手,我想从loadData()获取label值,用于dbRef!上数据库的路径(参考)!。子项(place+“/placeLabel”)。我是什么意思?!我读取“Dio Con Dio”节点上的数据。这是因为值place是let-place=“Dio-Con-Dio”。因此,我的应用程序不会从“Paradosiako-Panorama”节点加载数据。我想从数据库加载所有内容,我想如果我可以将place值更改为下一个节点,它就可以读取所有数据 import UIK

您好,我是swift编程新手,我想从
loadData()
获取
label
值,用于
dbRef!上数据库的路径(参考)!。子项(place+“/placeLabel”)
。我是什么意思?!我读取“Dio Con Dio”节点上的数据。这是因为值
place
let-place=“Dio-Con-Dio”
。因此,我的应用程序不会从“Paradosiako-Panorama”节点加载数据。我想从数据库加载所有内容,我想如果我可以将
place
值更改为下一个节点,它就可以读取所有数据

    import UIKit
    import FirebaseDatabase

    class PlacesTableViewController: UITableViewController {

        //MARK: Properties
        @IBOutlet weak var placesTableView: UITableView!

        //database reference
        var dbRef:FIRDatabaseReference?

        var places = [Places]()

        private var loadedLabels = [String: String]()
        private var loadedRatings = [String: Int]()

        //handler
        var handle:FIRDatabaseHandle?

        override func viewDidLoad() {
            super.viewDidLoad()

            dbRef = FIRDatabase.database().reference()

            // Loads data to cell.
            loadData()
        }

                private func loadData() {

                let place = "Dio Con Dio"

                dbRef!.child(place+"/placeLabel").observe(.childAdded, with: {
                    (snapshot) in
                    let label = snapshot.value as! String
                    self.updatePlace(snapshot.key, label: label)
                })
                dbRef!.child(place+"/rating").observe(.childAdded, with: {
                    (snapshot) in
                    let rating = snapshot.value as! Int
                    self.updatePlace(snapshot.key, rating: rating)
                })


            }

            private func updatePlace(_ key: String, label: String? = nil, rating: Int? = nil) {
                if let label = label {
                    loadedLabels[key] = label
                }
                if let rating = rating {
                    loadedRatings[key] = rating
                }
                guard let label = loadedLabels[key], let rating = loadedRatings[key] else {
                    return
                }
                if let place = Places(name: label, rating: rating) {
                    places.append(place)
                    placesTableView.reloadData()
                }
            }
        }

(此问题是后续问题。)

对于新的数据库架构,请尝试以下方法:

private func loadData() {
    dbRef!.observe(.childAdded) {
    (placeSnapshot) in
        print("Adding place \(placeSnapshot.key)...")

        // Load each label on the "placeLabel" list. 
        let labels = placeSnapshot.childSnapshot(forPath: "placeLabel")
        for (key, label) in labels.value as! [String: String] {
            self.updatePlace(key, label: label)
        }

        // Load each rating in the "rating" list. 
        let ratings = placeSnapshot.childSnapshot(forPath: "rating")
        for (key, rating) in ratings.value as! [String: Int] {
            self.updatePlace(key, rating: rating)
        }
    }
}
updatePlace
函数仅对由
loadData
分别加载的给定位置的标签和评级属性进行分组


放置删除操作。当然,上面的代码不会处理位置删除。为此,您还需要监听
childRemoved
事件

很难在评论中解释这一点,所以我将在这里讨论您当前的问题,但我相信保罗回答了您的问题。你甚至可以在这个问题上提出一个新问题

以下是您遇到问题的代码:

for (key, rating) in ratings.value as! [String: Int] {
            self.updatePlace(key, rating: rating)
        }
只要ratings.value中填充字符串:整数对,这段代码就没有问题。您的错误是因为不知何故丢失了一个密钥。(运行时发现NSNull,因此无法将数据转换为字典)

您需要在构建阵列的位置设置断点:

placeSnapshot.childSnapshot(forPath: "rating")
(这里称为评级/本地评级)。如果可以忽略没有键的条目,则跳过它们,不要将它们附加到数组中。但更可能的情况是,您出现了错误,需要找出添加空值的原因


这更有意义吗?如果Paulo解决了一个问题,请接受他的回答,并打开一个关于childSnapshot(代码)更多信息的新问题,肯定有人会帮助你。(我知道我会试试。)

为什么不将
标记为一个实例字段或使
loadData()
返回一个
String
类型?您还可以将
label
作为
inout
参数传递。因此,您希望从e函数中获取一个值,然后将其传递给loadData内部的标签?基本上,我希望在初始化前获得
label
值,以便在此处使用它:
dbRef!。子项(place+“/placeLabel”)
。我想将
标签
值分配给
位置
值。“Dio Con Dio”、“Paradosiako-Panorama”是现实生活中的地名。它可以工作,但每次我在数据库中添加新地名时都会出错。让我们说,已经有一个评级,placeLabel和评论的迪奥Con迪奥。如果有人在我的数据库中为Dio Con Dio再添加一个评级、评论和placeLabel,它将不会崩溃。现在,如果我删除了所有的Dio Con Dio评论、评级和placeLabel,并且有人打算第一次为Dio Con Dio添加评论、评级和placeLabel,它会崩溃,但它会在我的数据库中创建该节点。你明白吗?我以前的代码没有错误。但你明白我想做什么!该错误是因为您的密钥为空,并且您强制使用“!”进行匹配。只有当您的密钥不为nil且不为空(“”@Mozahler)时,才应尝试获取该值。是的,但使用我之前的代码,它不会崩溃。我理解。在使用新代码之前,应该检查并确保您拥有有效的密钥。例如,“如果让keyValue=key{}”。你不应该使用“!”因为它会崩溃。这是一个容易解决的问题。保罗在代码方面做得很好,但你需要让它与你的数据一起工作。(或者试着弄清楚为什么你的钥匙是空的。)谢谢你们抽出时间来跟进我的答案。你的分析对我来说似乎恰到好处:-)@Mozahler我明白你的答案了谢谢。