我试图获取URLRequest的所有信息,以便将其保存在日志中。当我尝试做String(reflecting: request)时,问题就出现了。这种方法只给出我的最终网址,而不是所有其他信息,如身体,httpMethod,编码等。
但是,如果我执行po request,我可以看到请求的所有信息。
有什么暗示吗?
谢谢
发布于 2022-02-01 10:54:03
您可以使用对象的.description和.debugDescription来输出描述。这些属性分别依赖于CustomStringConvertible和CustomDebugStringConvertible协议。
要更改打印出来的内容,可以定义/重新定义协议的一致性。作为URLRequest的一个简单示例
extension URLRequest: CustomDebugStringConvertible {
var debugDescription: String {
"""
URL Request for \(self)
full url \(self.url)
header fields \(self.allHTTPHeaderFields)
"""
}
}
let url = URL(string: "https://somedomain.com")
var request = URLRequest(url: url!)
request.addValue("ghuaidbwjkbdwd", forHTTPHeaderField: "Auhentication")
print(request.debugDescription)威尔输出
URL Request for https://somedomain.com
full url Optional(https://somedomain.com)
header fields Optional(["Auhentication": "ghuaidbwjkbdwd"])显然,您可能希望对输出做一些更有用的事情,但是这应该会给您提供一些工具。
当对具有预定义一致性的对象执行此操作时(例如。URLRequest,它是在基金会中定义的)您将得到关于以前的实现的警告。
在这个场景中,由于对象已经符合描述协议,所以您可以忽略它,而只是重写属性。因此,在上面的示例中,您应该实际使用
extension URLRequest {
var debugDescription: String {如果使用的对象是类,则需要将其标记为override。
如果您想获取对象的所有属性,可以使用一个镜像。您可以使用扩展直接在对象上定义它,但是如果您可能在多个地方使用它,则可以通过具有默认实现的协议来实现它:
protocol Reflectable {
func reflect()
}
extension Reflectable {
func reflect() {
let mirror = Mirror(reflecting: self)
print("\(Self.self) for: \(self)")
for item in mirror.children {
print("\(String(describing: item.label)): \(item.value)")
}
}
}然后,您可以订阅URLRequest并直接访问.reflect()方法,或者将其构建到CustomStringConvertible或CustomDebugStringConvertible中。
extension URLRequest: Reflectable {}
request.reflect()提供以下方面的产出:
URLRequest for: https://somedomain.com
Optional("url"): Optional(https://somedomain.com)
Optional("cachePolicy"): 0
Optional("timeoutInterval"): 60.0
Optional("mainDocumentURL"): nil
Optional("networkServiceType"): NSURLRequestNetworkServiceType
Optional("allowsCellularAccess"): true
Optional("httpMethod"): Optional("GET")
Optional("allHTTPHeaderFields"): Optional(["Auhentication": "ghuaidbwjkbdwd"])
Optional("httpBody"): nil
Optional("httpBodyStream"): nil
Optional("httpShouldHandleCookies"): true
Optional("httpShouldUsePipelining"): falsehttps://stackoverflow.com/questions/70938737
复制相似问题