Быстрое Отражение структуры класса, а не нуждающийся в экземпляре класса? - PullRequest
0 голосов
/ 25 февраля 2019

В моем коде у меня есть массив класса, который может не иметь членов в точке, где я хочу получить свойства через отражение.Для зеркала (для отражения :) требуется экземпляр, но я застрял в том, как с этим справиться, если у меня еще нет экземпляров.

Вот как в документации Apple показан пример отражения:

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

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

Чтобы упростить мой сценарий, по сути, я хочу сделать зеркальную «точку», а не «р».

Есть идеи?

1 Ответ

0 голосов
/ 27 февраля 2019

Я собираюсь закрыть это сам, потому что это была просто плохая идея.Я призываю других не использовать этот подход по нескольким причинам:

  1. Это работает, только если у вас есть хотя бы один элемент в массиве класса / struct
  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

}

Обратите внимание, что кодвыше оптимизирован для чтения, и я уверен, что это может быть более жестким.Я, конечно, открыт для комментариев о лучших способах сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...