gpt4 book ai didi

swift - 将关联对象添加到 URLRequest

转载 作者:行者123 更新时间:2023-11-30 12:43:17 24 4
gpt4 key购买 nike

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

关于如何解决这个问题有什么想法吗?

咕噜!

最佳答案

您需要能够添加一个变量来保存关联的对象 - 但您无法通过扩展来做到这一点。

可以通过创建基于URLRequest的自定义类来实现这一点 - 您不更改的任何内容都将保持原样,但您可以添加尽可能多的变量你需要。

关于swift - 将关联对象添加到 URLRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41986994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com