2017-02-01 6 views
0

Я пытаюсь сделать расширение на 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!

ответ

0

Вы должны иметь возможность добавить переменную для хранения связанного объекта, но вы не можете сделать это с помощью расширений.

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

Смежные вопросы