Alamofire.swift(三)-URLRequest

extension URLRequest {
    public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws {
        let url = try url.asURL()

        self.init(url: url)

        httpMethod = method.rawValue

        if let headers = headers {
            for (headerField, headerValue) in headers {
                setValue(headerValue, forHTTPHeaderField: headerField)
            }
        }
    }

    func adapt(using adapter: RequestAdapter?) throws -> URLRequest {
        guard let adapter = adapter else { return self }
        return try adapter.adapt(self)
    }
}

url是继承了URLConvertible协议的类型

method是HTTPMethod枚举类型

public enum HTTPMethod: String {
case get = "GET"
case head = "HEAD"
case post = "POST"
...
}

headersHTTPHeaders类型,其实就是通过类型重命名typealias关键字,将key-value都为String类型的字典重命名为HTTPHeaders

//A dictionary of headers to apply to a URLRequest.
public typealias HTTPHeaders = [String: String]

并且可以看出,url和method都是必须要有的,headers是可选的


let url = try url.asURL()

这里用try,是因为asURL()定义在类型转换时出现错误throws异常

self.init(url: url)

这里调用URLRequest的初始化方法
//Creates and initializes a URLRequest with the given URL and cache policy.
public init ( url: URL, cachePolicy: URLRequest.CachePolicy = default, timeoutInterval: TimeInterval = default )
这里的CachePolicy其实是NSURLRequest,默认是:.useProtocolCachePolicy
public typealias CachePolicy = NSURLRequest.CachePolicy


httpMethod = method.rawValue

举个官方的🌰,貌似挺好理解

enum PaperSize: String {
    case A4, A5, Letter, Legal
}
let selectedSize = PaperSize.Letter
print(selectedSize.rawValue)
// Prints "Letter"
print(selectedSize == PaperSize(rawValue: selectedSize.rawValue)!)
// Prints "true"

if let headers = headers {
            for (headerField, headerValue) in headers {
                setValue(headerValue, forHTTPHeaderField: headerField)
            }
        }

for循环的这种方式是由于headers是元组类型


当看到using adapter: RequestAdapter?的时候,我已经知道这是个协议了,而且有throws,说明我们在return的时候需要try。
使用guard来判断是否有值,比if更加清晰

public protocol RequestAdapter {
    func adapt(_ urlRequest: URLRequest) throws -> URLRequest
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容