Swift 访问结构中的数据以在NSTableView中使用

Swift 访问结构中的数据以在NSTableView中使用,swift,macos,uitableview,struct,Swift,Macos,Uitableview,Struct,我对编程相当陌生,我已经在这上面呆了一段时间了。我有一个名为Patient的结构,它充满了变量,例如var FIRST:String 我已经编写了从JSON检索数据并填充此结构的代码。它工作正常,我可以调用print(患者)并在控制台中查看所有数据 该结构的实例是一个2d数组,因此当我打印到控制台时,我会得到Patient(第一个:“Bob”,最后一个:“Smith”)Patient(第一个:“Dave”,最后一个:“Evans”)Patient(第一个:“Liz”,最后一个:“Taylor”)

我对编程相当陌生,我已经在这上面呆了一段时间了。我有一个名为Patient的结构,它充满了变量,例如var FIRST:String

我已经编写了从JSON检索数据并填充此结构的代码。它工作正常,我可以调用print(患者)并在控制台中查看所有数据

该结构的实例是一个2d数组,因此当我打印到控制台时,我会得到Patient(第一个:“Bob”,最后一个:“Smith”)Patient(第一个:“Dave”,最后一个:“Evans”)Patient(第一个:“Liz”,最后一个:“Taylor”)

第一个tableview方法工作正常,并返回3的计数

第二个是我被困的地方:

我宣布:

static var globalPatientInstance: [Patient] = []
然后,使用完成处理程序中的数据填充。下面是第二种方法:

extension ViewController: NSTableViewDelegate {

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    let item = ViewController.globalPatientInstance[row]

    let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView

    cell?.textField?.stringValue = item[(tableColumn?.identifier)!]!

    return cell!
}
}  
这将给出“类型“Patient”没有下标成员”

但是,如果我将行更改为:

cell?.textField?.stringValue = item.FIRST
代码将运行,我在表视图中得到三行,每行有不同的名称-Bob、Dave、Liz

获取其余数据的正确方法是什么,即最后显示的项目

感谢您的帮助,我尝试了很多不同的方法,但我真的被困在了这个问题上。

“键入“Patient”没有下标成员”-此错误是因为您试图以数组的形式访问Patient。项是结构,而不是数组

当你说你的结构是一个二维数组时,这是没有意义的。您的结构是一个结构。“2D”数组只是结构的全局实例变量数组。[患者]是一个一维阵列

let item = ViewController.globalPatientInstance[row] // item is now a Patient struct
let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView

cell?.textField?.stringValue = item[(tableColumn?.identifier)!]! // This doesn't work because Patient is not an array, but a struct
cell?.textField?.stringValue = item.FIRST // This works because you are accessing the property of item
cell?.textField?.stringValue = item.LAST // This is to display the LAST property of item

return cell!
}

注意--请将类属性命名为camelCase。。您可以将此样式指南用作新手参考


此外,使用first和last是不好的属性命名约定,因为它听起来像first是数组的第一个元素。我会推荐firstName和lastName。

我猜出来了。谢谢你们的帮助。此方法满足我的需要:

extension ViewController: NSTableViewDelegate {

fileprivate enum CellIdentifiers {
    static let firstName = "FIRST"
    static let lastName = "LAST"
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    var cellValue: String = ""
    var cellIdentifier: String = ""

    let item = ViewController.globalPatientInstance[row]

    if tableColumn == tableView.tableColumns[0] {
        cellValue = item.FIRST
        cellIdentifier = CellIdentifiers.firstName
    }

    else if tableColumn == tableView.tableColumns[1] {
        cellValue = item.LAST
        cellIdentifier = CellIdentifiers.lastName
    }

    if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: cellIdentifier), owner: nil) as? NSTableCellView {

        cell.textField?.stringValue = cellValue
        //cell.textField?.stringValue = lastName
        return cell
    }
    return nil
}
}

在单元格中添加第二个文本字段,或将两个字段连接成一个字符串,并在文本字段中使用该字符串谢谢您的回复!关于命名,它与我从JSON URL获得的名称相匹配,但我同意你的观点。我知道我有一个结构,我需要一个数组。我坚持的是从a到b的最好方式。我确实使用了.map将名称提取到单独的数组中,但我不知道如何将其合并回一个数组中,以便在考虑任何nil值的同时提供给表视图。感谢您的帮助!我不明白你为什么需要阵列?你想完成什么?每行有一个项目。