[Core] AFError.swift 분석

Posted by Neph's Blog on July 29, 2021

AFError

Alamofire의 Error들은 AFError.swift라는 하나의 파일 내에서 관리된다.

가장 큰 틀인 AFError(enum type) 안에 여러 enum, struct가 nested되어있다. AFError - Nested Enum - Case 구조로 이루어져있으며 Nested Enum에서 어떤 작업이 실패했는지를, Case에서 그 이유를 설명하는 구조로 이루어져있다.

계층 구조 Error Example

1
2
3
4
5
6
7
8
9
public enum AFError: Error {
	public enum MultipartEncodingFailureReason {
		case bodyPartURLInvalid(url: URL)
    // ...
	}
  
  /// Multipart form encoding failed.
  case multipartEncodingFailed(reason: MultipartEncodingFailureReason)
}

Nested Enum에는 MultipartEncodingFailureReason, ParameterEncodingFailureReason, ResponseValidationFailureReason, ServerTrustFailureReason, URLRequestValidationFailureReason 이 있다. 네이밍이 매우 직관적이어서 사용자 입장에서 편할 것 같다.

간혹 struct가 nested 되어있는 경우가 있는데, 이는 swift enum의 특성상 stored property를 저장할 수 없기 때문인 것으로 보인다.

Nested Enum Example

1
2
3
4
5
6
public struct UnexpectedInputStreamLength: Error {
        /// The expected byte count to read.
        public var bytesExpected: UInt64
        /// The actual byte count read.
        public var bytesRead: UInt64
    }

다양한 연산 프로퍼티는 AFError, nested Enum 등 여러 활용용도에 맞추어 extension으로 각각 분리되어있다.

Extension을 통한 연산 프로퍼티 제공 Example

1
2
3
4
5
6
7
8
9
10
11
extension AFError.ParameterEncodingFailureReason {
    var underlyingError: Error? {
        switch self {
        case let .jsonEncodingFailed(error),
             let .customEncodingFailed(error):
            return error
        case .missingURL:
            return nil
        }
    }
}

소스코드 전문은 https://github.com/Alamofire/Alamofire/blob/master/Source/AFError.swift 에서 확인할 수 있다.