【问题标题】:how to add information in an array with a class Swift如何使用 Swift 类在数组中添加信息
【发布时间】:2018-11-04 11:44:40
【问题描述】:

我在数组中添加一些信息时遇到了问题。

我的班航班由以下定义:

class Flight{
let date: String
let type: String
let regi: String

let totalTime: String

let depTime: String
let depPlace: String

let arrTime: String
let arrPlace: String

init(from dat: String, _ typ: String, _ reg: String, _ totaltim: String, _ depTim: String, _ depPlac: String, _ arrTim: String, _ arrPlac: String) {
    self.date = dat
    self.type = typ
    self.regi = reg

    self.totalTime = totaltim

    self.depTime = depTim
    self.depPlace = depPlac

    self.arrTime = arrTim
    self.arrPlace = arrPlac
}}

在我的主代码中,我已经像这样声明我的数组:

var datas: [Flight] = []

最后我有这段代码来添加一些来自 firebase 的信息: (我添加一些评论来告诉你什么 print() 结果)

if let user = Auth.auth().currentUser{
        // user is connect
        let ref = Database.database().reference()
        let userID = Auth.auth().currentUser?.uid

        let ev = ref.child("flights").child(userID!)

        ev.observe(.childAdded, with: { (snapshot) -> Void in
        let flightKey = snapshot.key

        ref.child("flights").child(userID!).child(flightKey).observeSingleEvent(of: .value) {(snapshot) in
            let value = snapshot.value as? NSDictionary

            let date = value?["Date"] as? String ?? "no date"
            let type = value?["aircraft-model"] as? String ?? "no type"
            let registration = value?["aircraft-registration"] as? String ?? "no callsign"
            let totalTime = value?["TOTAL-TIME"] as? String ?? "no total Time"
            let deppartTime = value?["departure-time"] as? String ?? "no departure Time"
            let deppartPlace = value?["departure-place"] as? String ?? "no departure Place"
            let arrivalTime = value?["arrival-time"] as? String ?? "no arrival Time"
            let arrivalPlace = value?["arrival-place"] as? String ?? "no arrival Place"

            print("Date : \(date) - type : \(type) - registration : \(registration) - Etc ...")// Give me exactly the value I requested


            self.datas.append(Flight(from: date, type, registration, totalTime, deppartTime, deppartPlace, arrivalTime, arrivalPlace))


            print(self.datas)// Give me "MyProjectName.Flight ...
            }

        })

    }else{
        // si non connecté alors DECONNEXION !!!!
        fatalError("error ...")
    }

所以我不明白为什么如果我打印从 firebase 接收到的值它可以工作,但是如果我打印由 firebase 接收到的值完成的数组值它不起作用?

感谢您的帮助!

Flyer-74

【问题讨论】:

    标签: ios arrays swift class


    【解决方案1】:

    欢迎 :)

    我认为一切都如预期的那样,您只是看到了这一点,因为 Swift 不知道如何描述您的对象。

    要解决此问题,您应该在 Flight 类 (https://developer.apple.com/documentation/swift/customstringconvertible) 中实现 CustomStringConvertible 协议

    类似

    extension Flight: CustomStringConvertible {
        var description: String {
            var description = ""
            description.append("date: \(date)\n")
            description.append("type: \(type)\n")
            description.append("regi: \(regi)\n")
            //and so on
            return description
        }
    }
    

    应该给你你正在寻找的东西。

    希望对你有帮助

    【讨论】:

    • 嗨!它工作得很好,但是如何使用该值将其添加到标签上?我已经这样尝试过: dateLabel.text = datas[indexPath.row].date 但没有出现...
    • @flyer74 有趣...应该可以。你能告诉我你尝试在哪里添加文本吗?我猜它在一个表格视图中,因为您指的是indexPath。同样,也许可以尝试在该行添加一个断点,然后查看您的 datas 数组在该点包含什么。
    • 确认我正在尝试填写一个表格视图,因此完整的代码放在 :override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 函数中。显示日期的完整代码行是cell.dateLabel.text = datas[indexPath.row].date。我现在用断点试试
    • 太疯狂了!当数据数组由来自我的class Flight 的信息完成时,控件不会进入cellForRow function...但是当我在我的数组中手动​​添加一些信息时:var datas: [Flight] = [Flight(from: "21-10-18", "C172", "F-GIRQ", "01:00", "13:00", "LFLK", "14:00", "LFHS")] 这工作得很好...跨度>
    • 也许你的问题是,在你的tableview被填充的时候,数据还没有准备好,这意味着当cellForRowAt被调用时,它没有内容可以显示。在上面的代码中,数据的检索似乎是异步完成的,这意味着当 tableview 开始调用 cellForRowAt 时它还没有准备好。要解决此问题,请在完成填充数组后调用 tableView.reloadData() 以告诉 tableview 重新呈现其内容。
    【解决方案2】:

    你可以尝试采用CustomStringConvertible协议

    class Flight : CustomStringConvertible {
    
        var description: String {
            return "\(date) \(type)"  // add here any variable you want it to be printed 
        }
    
            let date: String
            let type: String
            let regi: String
            let totalTime: String
            let depTime: String
            let depPlace: String
            let arrTime: String
            let arrPlace: String
            init(from dat: String, _ typ: String, _ reg: String, _ totaltim: String, _ depTim: String, _ depPlac: String, _ arrTim: String, _ arrPlac: String) {
                self.date = dat
                self.type = typ
                self.regi = reg
                self.totalTime = totaltim
                self.depTime = depTim
                self.depPlace = depPlac
                self.arrTime = arrTim
                self.arrPlace = arrPlac
            }
    
     }
    

    【讨论】:

      【解决方案3】:

      您可以通过向Flight 添加扩展来为您的对象添加自定义调试描述,并使其符合CustomDebugStringConvertible 协议。遵守此协议要求您提供一个属性:var debugDescription: String { get }。在此字符串中,您可以完全控制自定义对象的调试值。

      extension Flight: CustomDebugStringConvertible { var debugDescription: String { return "Date: \(date), Type: \(type), Registartion: \(regi)" } }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        相关资源
        最近更新 更多