我正在尝试在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
所以我意识到这是因为在swift 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
对象。
关于如何解决这个问题的任何想法?
颤鸣!
答案 0 :(得分:0)
您需要能够添加一个变量来保存关联对象 - 但是您不能使用扩展名来执行此操作。
您可以通过创建基于before_x
的自定义类来完成此操作 - 您未更改的任何内容保持原样,但您可以根据需要添加任意数量的变量。