Обновление :
ОП добавил этот комментарий, разъяснив требования:
Мне нужно, чтобы «ключ» отличался для 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
, который вы создадите, будет возвращено уникальное значение, которое не изменится.