美文网首页
Alamofire源码解析 - AFError

Alamofire源码解析 - AFError

作者: wanglj | 来源:发表于2017-03-21 15:22 被阅读0次

    AFErrorAlamofire定义的errortype,包含几个不同的错误类型

        case invalidURL(url: URLConvertible)
        case parameterEncodingFailed(reason: ParameterEncodingFailureReason)
        case multipartEncodingFailed(reason: MultipartEncodingFailureReason)
        case responseValidationFailed(reason: ResponseValidationFailureReason)
        case responseSerializationFailed(reason: ResponseSerializationFailureReason)
    
    

    在 Swift 中,我们可以定义这样的枚举类型,它的每一个枚举项都有一个附加信息,来扩充这个枚举项的信息表示,这又叫做关联值。这里的每个case都有一个关联值

    • URLConvertible 是一个协议定义在Alamofire.swift中,表示可以转换成URL的类型
    • 另外四种都是枚举定义在AFError
        public enum ParameterEncodingFailureReason {
            case missingURL
            case jsonEncodingFailed(error: Error)
            case propertyListEncodingFailed(error: Error)
        }
    
        public enum MultipartEncodingFailureReason {
            case bodyPartURLInvalid(url: URL)
            case bodyPartFilenameInvalid(in: URL)
            case bodyPartFileNotReachable(at: URL)
            case bodyPartFileNotReachableWithError(atURL: URL, error: Error)
            case bodyPartFileIsDirectory(at: URL)
            case bodyPartFileSizeNotAvailable(at: URL)
            case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error)
            case bodyPartInputStreamCreationFailed(for: URL)
    
            case outputStreamCreationFailed(for: URL)
            case outputStreamFileAlreadyExists(at: URL)
            case outputStreamURLInvalid(url: URL)
            case outputStreamWriteFailed(error: Error)
    
            case inputStreamReadFailed(error: Error)
        }
    
        public enum ResponseValidationFailureReason {
            case dataFileNil
            case dataFileReadFailed(at: URL)
            case missingContentType(acceptableContentTypes: [String])
            case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String)
            case unacceptableStatusCode(code: Int)
        }
    
        public enum ResponseSerializationFailureReason {
            case inputDataNil
            case inputDataNilOrZeroLength
            case inputFileNil
            case inputFileReadFailed(at: URL)
            case stringSerializationFailed(encoding: String.Encoding)
            case jsonSerializationFailed(error: Error)
            case propertyListSerializationFailed(error: Error)
        }
    
    
    

    另外AFError除了定义了AFError和上面的枚举,还包括继承ErrorAdaptError

    代码后面剩下的都是extension,分为三类

    • Error BooleansAFError添加了五个属性都是Bool类型,用于判断错误的类型。
    public var isInvalidURLError: Bool {
            if case .invalidURL = self { return true }
            return false
        } 
    public var isParameterEncodingError: Bool 
    public var isMultipartEncodingError: Bool 
    public var isResponseValidationError: Bool
    public var isResponseSerializationError: Bool
    
    • Convenience PropertiesAFError添加了五个属性,返回case的关联值。
     /// The `URLConvertible` associated with the error.
        /// The `URLConvertible` associated with the error.
        public var urlConvertible: URLConvertible? {
            switch self {
            case .invalidURL(let url):
                return url
            default:
                return nil
            }
        }
    
        /// The `URL` associated with the error.
        public var url: URL? {
            switch self {
            case .multipartEncodingFailed(let reason):
                return reason.url
            default:
                return nil
            }
        }
    
        /// The `Error` returned by a system framework associated with a `.parameterEncodingFailed`,
        /// `.multipartEncodingFailed` or `.responseSerializationFailed` error.
        public var underlyingError: Error? {
            switch self {
            case .parameterEncodingFailed(let reason):
                return reason.underlyingError
            case .multipartEncodingFailed(let reason):
                return reason.underlyingError
            case .responseSerializationFailed(let reason):
                return reason.underlyingError
            default:
                return nil
            }
        }
    
    
    • Error Descriptions:每种错误的说明
      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
            }
        }
    

    这段代码中没有涉及到Alamofire的核心功能,看这段源码只是为了以后能更加简单的理解Alamofire中复杂的代码。

    相关文章

      网友评论

          本文标题:Alamofire源码解析 - AFError

          本文链接:https://www.haomeiwen.com/subject/secgnttx.html