快速反射类结构而不需要类的实例?

时间:2019-02-25 15:48:38

标签: reflection swift4

在我的代码中,我有一个类的数组,在要通过反射获取属性的点上可能没有任何成员。 Mirror(reflecting :)需要一个实例,但是如果我还没有任何实例,那么我将如何处理这个问题。

这是苹果公司的文档显示反思的示例:

struct Point {
    let x: Int, y: Int
}

let p = Point(x: 21, y: 30)
print(String(reflecting: p))
// Prints "▿ Point
//           - x: 21
//           - y: 30"

为简化我的情况,本质上我想做的是镜像“ Point”而不是“ p”。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我要自己解决这个问题,因为这只是一个全面的坏主意。我鼓励其他人出于多种原因不使用这种方法:

  1. 仅当您在一个类/结构的数组中至少有一项时才有效
  2. 属性名称作为类标题出现在类中时,您会陷入困境

相反,我使用逻辑来搜索在情节提要中设置的单元格标识符。当找到与我的属性名称匹配的单元格标识符时,将文本设置为该值。该行的标题设置在情节提要中,因此可以轻松进行编辑和(手动)格式化。

这是任何有兴趣的人的代码。

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

    if viewOrder!.orders.count == 0 {
        return nil
    }

    let cellIdentifier = tableColumn!.identifier.rawValue
    let orderRow = viewOrder!.orders[row]
    var text = ""
    let mirror = Mirror(reflecting: orderRow)
    for (name, value) in mirror.children        {
        if name == cellIdentifier {
            text = "\(value)"
        }
    }

    if let cell = orderTableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(cellIdentifier), owner: nil) as? NSTableCellView {
        cell.textField?.stringValue = text
        return cell
    } else {
        print("Didn't create cell in column \(tableColumn!.headerCell.title): \(cellIdentifier) : \(text)")
    }

    return nil

}

请注意,上面的代码已针对阅读进行了优化,我相信它会更紧密。当然,我愿意就更好的方法发表意见。