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 에서 확인할 수 있다.