Alamofire.swift(一)-URLConvertible

簡單粗暴的學習方法:一行一行看,遇到問題,弄懂問題

首先來看4.0.1版本的代碼行數:

6571

find . "(" -name "*.swift" ")" -print | xargs wc -l;
Paste_Image.png

先從Alamofire.swift文件入手:

接下來學習
URLConvertibleAFError

URL 和 URLComponents 的不同之處在于:URL component屬性是 readwrite 的。它提供了安全直接的方法來修改URL的各個部分。

URLConvertible協議:
用于NSURL和String之間的相互轉換,alamofire的思想還是很值得學習的:

這個protocol只定義了一個var, 遵循這個協議的類必須實現URLString返回String的這個功能.
接下來讓所有可以轉化為String的類全部遵循這個協議

public protocol URLConvertible {
    func asURL() throws -> URL
}

extension String: URLConvertible {
conforms to RFC 2396 or throws an `AFError`.
    public func asURL() throws -> URL {
        guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }
        return url
    }
}

extension URL: URLConvertible {
    public func asURL() throws -> URL { return self }
}

extension URLComponents: URLConvertible {
    public func asURL() throws -> URL {
        guard let url = url else { throw AFError.invalidURL(url: self) }
        return url
    }
}

AFError:

這里有一種枚舉嵌套枚舉的寫法:


public enum AFError: Error {

    public enum ParameterEncodingFailureReason {
        case missingURL
        case jsonEncodingFailed(error: Error)
        case propertyListEncodingFailed(error: Error)
    }
    ...
    case invalidURL(url: URLConvertible)
    case parameterEncodingFailed(reason: ParameterEncodingFailureReason)
    case multipartEncodingFailed(reason: MultipartEncodingFailureReason)
    case responseValidationFailed(reason: ResponseValidationFailureReason)
    case responseSerializationFailed(reason: ResponseSerializationFailureReason)
}

AFError的Booleans擴展:用于對每一類錯誤進行返回匹配結果

// MARK: - Error Booleans

extension AFError {
    /// Returns whether the AFError is an invalid URL error.
    public var isInvalidURLError: Bool {
        if case .invalidURL = self { return true }
        return false
    }
    ...

AFError的Convenience擴

// MARK: - Convenience Properties

extension AFError {
    /// The `URLConvertible` associated with the error.
    public var urlConvertible: URLConvertible? {
        switch self {
        case .invalidURL(let url):
            return url
        default:
            return nil
        }
    }
    ...

針對AFError中的ParameterEncodingFailureReason類型錯誤進行擴展

extension AFError.ParameterEncodingFailureReason {
    var underlyingError: Error? {
        switch self {
        case .jsonEncodingFailed(let error), .propertyListEncodingFailed(let error):
            return error
        default:
            return nil
        }
    }
}

LocalizedError協議:描述了不同Error信息

Foundation:
/// Describes an error that provides localized messages describing why
/// an error occurred and provides more information about the error.
public protocol LocalizedError : Error {
    public var errorDescription: String? { get }
    public var failureReason: String? { get }
    public var recoverySuggestion: String? { get }
    public var helpAnchor: String? { get }
}

這里實現了errorDescription,localizedDescription是每一個錯誤類型中實現的的變量值,直接返回對應的錯誤原因

// MARK: - Error Descriptions

extension AFError: LocalizedError {
    public var errorDescription: String? {
        switch self {
        case .invalidURL(let url):
            return "URL is not valid: \(url)"
        case .parameterEncodingFailed(let reason):
            return reason.localizedDescription
        case .multipartEncodingFailed(let reason):
            return reason.localizedDescription
        case .responseValidationFailed(let reason):
            return reason.localizedDescription
        case .responseSerializationFailed(let reason):
            return reason.localizedDescription
        }
    }
}

extension AFError.ParameterEncodingFailureReason {
    var localizedDescription: String {
        switch self {
        case .missingURL:
            return "URL request to encode was missing a URL"
        case .jsonEncodingFailed(let error):
            return "JSON could not be encoded because of error:\n\(error.localizedDescription)"
        case .propertyListEncodingFailed(let error):
            return "PropertyList could not be encoded because of error:\n\(error.localizedDescription)"
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容