将关联对象添加到URLRequest

时间:2017-02-01 18:26:50

标签: swift swift3

我正在尝试在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对象。

关于如何解决这个问题的任何想法?

颤鸣!

1 个答案:

答案 0 :(得分:0)

您需要能够添加一个变量来保存关联对象 - 但是您不能使用扩展名来执行此操作。

可以通过创建基于before_x的自定义类来完成此操作 - 您未更改的任何内容保持原样,但您可以根据需要添加任意数量的变量。