簡單粗暴的學(xué)習(xí)方法:一行一行看,遇到問題,弄懂問題
首先來看4.0.1版本的代碼行數(shù):
6571
find . "(" -name "*.swift" ")" -print | xargs wc -l;
Paste_Image.png
先從Alamofire.swift文件入手:
接下來學(xué)習(xí)
URLConvertible / AFError
URL 和 URLComponents 的不同之處在于:URL component屬性是 readwrite 的护姆。它提供了安全直接的方法來修改URL的各個部分。
URLConvertible協(xié)議:
用于NSURL和String之間的相互轉(zhuǎn)換,alamofire的思想還是很值得學(xué)習(xí)的:
這個protocol只定義了一個var, 遵循這個協(xié)議的類必須實現(xiàn)URLString返回String的這個功能.
接下來讓所有可以轉(zhuǎn)化為String的類全部遵循這個協(xié)議
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擴展:用于對每一類錯誤進行返回匹配結(jié)果
// 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協(xié)議:描述了不同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 }
}
這里實現(xiàn)了errorDescription陈辱,localizedDescription是每一個錯誤類型中實現(xiàn)的的變量值,直接返回對應(yīng)的錯誤原因
// 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)"
}
}
}