简单粗暴的学习方法:一行一行看,遇到问题,弄懂问题
首先来看4.0.1版本的代码行数:
6571
find . "(" -name "*.swift" ")" -print | xargs wc -l;
Paste_Image.png
先从Alamofire.swift文件入手:
接下来学习
URLConvertible / AFError
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)"
}
}
}
网友评论