Чтобы иметь связанный объект в Swift, вы просто используете адрес памяти в качестве дескриптора, а затем используете вызовы objc.
Обычный пример кода, который вы можете найти везде:
var keyA:UInt8 = 0
var keyB:UInt8 = 0
extension UIViewController {
var aoAA: String? {
get { return objc_getAssociatedObject(self, &keyA) as? String }
set { objc_setAssociatedObject(self, &keyA, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
}
var aoBB: String? {
get { return objc_getAssociatedObject(self, &keyB) as? String }
set { objc_setAssociatedObject(self, &keyB, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
}
}
это отлично работает,
class Thing: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
aoAA = "this is a"
print("...... \(aoAA)")
aoBB = "this is b"
print("...... \(aoBB)")
aoAA = "changed A"
print("...... \(aoAA) \(aoBB)")
aoBB = "changed B"
print("...... \(aoAA) \(aoBB)")
aoAA = aoBB
print("...... \(aoAA) \(aoBB)")
}
Но подождите...
Дескрипторы, keyA и keyB, являются глобальными для всего проекта.
Когда вы используете aoAA и aoBB в разных UIViewController, как может быть, что aoAA и aoBB действуют как свойства, специфичные для этого экземпляра?
Неужели везде в проекте только "один" аоАА?
т. е., aoAA является глобальным — точно так же, как дескриптор keyA является глобальным?
Мое тестирование показало, что они являются независимыми переменными, специфичными для разных экземпляров разных UIViewController, но это кажется безумным.
Как каждый экземпляр aoAA
может быть другим - он использует один и тот же глобальный дескриптор?