Alamofire.swift(一)-URLConvertible

簡單粗暴的學(xué)習(xí)方法:一行一行看,遇到問題,弄懂問題

首先來看4.0.1版本的代碼行數(shù):

6571

find . "(" -name "*.swift" ")" -print | xargs wc -l;
Paste_Image.png

先從Alamofire.swift文件入手:

接下來學(xué)習(xí)
URLConvertibleAFError

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)"
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末细诸,一起剝皮案震驚了整個濱河市沛贪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌震贵,老刑警劉巖利赋,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猩系,居然都是意外死亡媚送,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門寇甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘偎,“玉大人,你說我怎么就攤上這事拿霉∫髦龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵绽淘,是天一觀的道長涵防。 經(jīng)常有香客問我,道長沪铭,這世上最難降的妖魔是什么壮池? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮杀怠,結(jié)果婚禮上火窒,老公的妹妹穿的比我還像新娘。我一直安慰自己驮肉,他們只是感情好熏矿,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般票编。 火紅的嫁衣襯著肌膚如雪褪储。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天慧域,我揣著相機與錄音鲤竹,去河邊找鬼。 笑死昔榴,一個胖子當(dāng)著我的面吹牛辛藻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播互订,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吱肌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仰禽?” 一聲冷哼從身側(cè)響起氮墨,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吐葵,沒想到半個月后规揪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡温峭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年猛铅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凤藏。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡奕坟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出清笨,到底是詐尸還是另有隱情,我是刑警寧澤刃跛,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布抠艾,位于F島的核電站,受9級特大地震影響桨昙,放射性物質(zhì)發(fā)生泄漏检号。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一蛙酪、第九天 我趴在偏房一處隱蔽的房頂上張望齐苛。 院中可真熱鬧,春花似錦桂塞、人聲如沸凹蜂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玛痊。三九已至汰瘫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擂煞,已是汗流浹背混弥。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对省,地道東北人蝗拿。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蒿涎,于是被迫代替她去往敵國和親哀托。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容