Я пытаюсь сделать расширение на URLRequest, которое позволяет его инициализировать связанным с ним объектом, а затем сможет получить этот объект позже, чтобы узнать, относится ли этот запрос к этому объекту , Моя первая попытка была:Добавление связанного объекта в URLRequest
class User {
init(_ id: Int) {
self.id = id
}
let id: Int
}
private var userKey: UInt8 = 0
extension URLRequest {
init(url: URL, user: User) {
self.init(url: url)
objc_setAssociatedObject(self, &userKey, user, .OBJC_ASSOCIATION_RETAIN)
}
var user: User? {
return objc_getAssociatedObject(self, &userKey) as? User
}
}
let user1 = User(3)
let req1 = URLRequest(url: URL(string: "google.com")!, user: user1)
print(req1.user?.id ?? -1) // prints -1
Так я понял, что это потому, что в быстром 3, URLRequest не является структурой. Правильно ли я предположить, что вы не можете использовать objc_setAssociatedObject
для типа структуры успешно? Документы для objc_setAssociatedObject
указывают Any
как тип параметра, так что не уверены, но было бы разумным, я думаю, или я ничего не вижу, и это возможно?
Вторая попытка: Вместо того чтобы делать
objc_setAssociatedObject(self, &userKey, user, .OBJC_ASSOCIATION_RETAIN)
Я сделал
objc_setAssociatedObject(self.url, &userKey, user, .OBJC_ASSOCIATION_RETAIN)
Это работает. Потому что я предполагаю, что URL-адрес является ссылочным типом. Но тогда проблема в том, что url также изменчив, поэтому позже кто-то может сделать request.url = blah
, и я потеряю связанный объект user
.
Любые идеи о том, как это решить?
Churr!