swift - 如何扩展 URLRequest

标签 swift nsmutableurlrequest swift-extensions urlrequest

尝试编写可维护的、干净的代码的结果:

func fetchNumbersFromServer(completion: @escaping (NumbersResult) -> Void) {
    let urlString = "https://some-site.com/some-file"
    var request = URLRequest(url: URL.init(string: urlString)!)
    // I want to configure the request, yet make the code extenda
    request = URLRequest.configure(request: request)
    // create URLSession configuration, delegate and session
    ...
    session.dataTask(with: request) { (data, response, error) -> Void in
        // handle response
    }.resume()
}

extension URLRequest {

    static func configure(request: URLRequest) -> URLRequest {
        // request in must be made mutable
        var request = request
        request.setValue("some user agent", forHTTPHeaderField: "User-Agent")
        request.timeoutInterval = 10

        return request
    }

}

通过使用类型方法,这可以修改请求。然而,这对我来说感觉很尴尬,所以我想知道是否有更好(或更有效)的方法来完成“配置”URLRequest。

最佳答案

您可以只创建一个 URLRequest 自定义初始化程序并为参数设置一个默认值:

extension URLRequest {
    init(_ url: URL, userAgent: String = "your default user agent", cachePolicy: CachePolicy = .useProtocolCachePolicy, timeInterval: TimeInterval = 60) {
        self.init(url: url, cachePolicy: cachePolicy, timeoutInterval: timeInterval)
        setValue(userAgent, forHTTPHeaderField: "User-Agent")
    }
}

struct NumbersResult { }

func fetchNumbersFromServer(request: URLRequest, completion: @escaping (NumbersResult) -> ()) {
    URLSession.shared.dataTask(with: request) { data, response, error  in
        // handle response
    }.resume()
}

let url = URL(string: "https://www.google.com")!
let request = URLRequest(url)  // you can also pass another userAgent, cachePolicy and timeInterval here if needed
fetchNumbersFromServer(request: request) { numbers in

}

关于swift - 如何扩展 URLRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47182754/

相关文章:

swift - 为什么我在第二个例子中得到保留圈?

swift - 找到两个 ImageView 重叠的重叠区域,并使该区域改变颜色

ios - Swift - 如何在项目中使用资源 excel 文件打开 excel 应用程序? (无法打开文件错误)

networking - AFNetworking 在 iOS 6 下停止工作

ios - 在swift中使用json发送参数

ios - 不支持的 URL 错误代码 -1002

swift - 如何在扩展 SequenceType 的协议(protocol)中限制 Generator.Element 的类型

swift - 在 Swift 中使用 iRareMedia iCloudDocumentSync

objective-c - Swift 从 .m 文件中读取私有(private)属性

swift - 在 Swift 4 中,您能否编写仅适用于遵守多种协议(protocol)的事物的扩展?