Swift: преобразовать имя экземпляра объекта в строку для использования в качестве ключа - PullRequest
0 голосов
/ 16 октября 2018

Учитывая var varName = "varValue", есть ли способ в Swift преобразовать имя переменной в String во время выполнения?Например, в этом случае я получу обратно "varName".

Я уже знаю об Mirror API для отражения в Swift.Это позволяет мне перебирать свойства данного класса, но я хотел бы применить это к self для любого данного класса.Я хочу использовать это для автоматической генерации ключей String для любого данного объекта (независимо от того, к какому классу он принадлежит)

extension UIView {
   var key: String {
      return "" //TODO: Convert self to varName as String
   }
}

// Usage
let customView = UIView()
customView.key // should be "customView"

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Обновление :

ОП добавил этот комментарий, разъяснив требования:

Мне нужно, чтобы «ключ» отличался для 2 экземпляров UIView.Я хочу, чтобы этот ключ был одинаковым для каждого конкретного экземпляра, т. Е. Ключ не должен меняться, если приложение перезапускается или экземпляр представления уничтожается и воссоздается.Я могу использовать этот ключ в качестве ключа в кэшировании.Другим вариантом использования может быть использование его в качестве accessibilityIdentifier для помощи с UITesting.

В этом случае я предлагаю даже не думать об использовании «magic».Просто явно дайте экземплярам вашего представления идентификатор.Вы также можете просто повторно использовать существующие свойства UIView, например tag или accessibilityIdentifier.Если этого недостаточно или недостаточно удобно, подкласс:

class IdentifiableView: UIView {
    public private(set) var identifier: String

    init(frame: CGRect, identifier: String) {
        self.identifier = identifier
        super.init(frame: frame)
        self.accessibilityIdentifier = identifier
    }

    init() {
        fatalError("Must use init(frame:identifier:)")
    }

    override init(frame: CGRect) {
        fatalError("Must use init(frame:identifier:)")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("Must use init(frame:identifier:)")
    }
}

// Usage
let firstView = IdentifiableView(frame: .zero, identifier: "First View")
firstView.identifier
firstView.identifier

let otherView = IdentifiableView(frame: .zero, identifier: "Second View")
otherView.identifier
otherView.identifier

Если, согласно вашему комментарию, вы просто хотите, чтобы «объекты возвращали уникальный ключ, который не изменяется», вы можете просто использоватьих адрес памяти:

extension UIView {
    var key: String {
        return "\(Unmanaged.passUnretained(self).toOpaque())"
    }
}

let firstView = UIView()
firstView.key // -> "0x00007fbc29d02f10"
firstView.key // -> "0x00007fbc29d02f10"

let otherView = UIView()
otherView.key // -> "0x00007fbc29d06920"
otherView.key // -> "0x00007fbc29d06920"

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

0 голосов
/ 16 октября 2018

Я не уверен, что вы пытаетесь сделать здесь, но я думаю, что вы можете преобразовать имя переменной в строку в Swift с помощью #keyPath(propertyName), но для этого нужно добавить @objc в вашу переменную.

Например,

class MyViewController : UIViewController {
    @objc var name: String = "John"
}

print(#keyPath(MyViewController.name))

печатает name в консоли.

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