閱讀 UIColor-Hex-Swift 源碼

由于種種原因,簡(jiǎn)書等第三方平臺(tái)博客不再保證能夠同步更新,歡迎移步 GitHub:https://github.com/kingcos/Perspective/。謝謝!

Read the mind behind the code.

  • Info:
  • Swift 3.0
  • Xcode 8.2.1
  • UIColor Hex Swift 3.0.2

前言

yeahdongcn/UIColor-Hex-Swift

yeahdongcn/UIColor-Hex-Swift 是一個(gè)使用 Swift 3.0 編寫并開源在 GitHub 上的 iOS 第三方庫(kù)。核心為不到 200 行代碼,即可以使用 RGBA 十六進(jìn)制數(shù)/字符串創(chuàng)建顏色(UIColor)。其支持通過 CocoaPods 管理,目前在 GitHub 上已經(jīng)擁有 683 Stars,說明該庫(kù)已經(jīng)幫助了不少開發(fā)者使用在了項(xiàng)目中。而我作為一個(gè)新手,就來仔細(xì)閱讀一下該庫(kù)的源碼,看看是否有值得借鑒的地方。

錯(cuò)誤處理

利用枚舉,通過遵守 Error 協(xié)議,來定義統(tǒng)一的錯(cuò)誤處理。Swift 中的 Error 協(xié)議也有說明,通過遵守該協(xié)議即可使錯(cuò)誤在 Swift 的錯(cuò)誤處理系統(tǒng)中保持一致性。

public enum UIColorInputError : Error {
    case missingHashMarkAsPrefix,
    unableToScanHexValue,
    mismatchedHexStringLength
}

擴(kuò)展

Swift 中的擴(kuò)展(extension)能夠很方便地?cái)U(kuò)充而不破壞原有的類。特別是在官方提供的類上,使用 extension 可以很容易的加上我們的自定義方法以及計(jì)算屬性(擴(kuò)展不支持存儲(chǔ)屬性)。

extension UIColor {
}

便利構(gòu)造器

便利構(gòu)造器(Convenience initializers)與指定構(gòu)造器(Designated initializers)不同。便利構(gòu)造器是次要的,即不是必需的。也可以在便利構(gòu)造器的內(nèi)部調(diào)用指定構(gòu)造器。

public convenience init(hex3: UInt16, alpha: CGFloat = 1) {
    let divisor = CGFloat(15)
    let red     = CGFloat((hex3 & 0xF00) >> 8) / divisor
    let green   = CGFloat((hex3 & 0x0F0) >> 4) / divisor
    let blue    = CGFloat( hex3 & 0x00F      ) / divisor
    self.init(red: red, green: green, blue: blue, alpha: alpha)
}

注釋

一般的單行注釋和多行注釋都已為人所知。但如何與官方注釋保持一致性和規(guī)范性,我個(gè)人卻在之前沒有了解到。在 Xcode 8 支持了 markdown 語(yǔ)法后,有人已經(jīng)開始通過 Playground 制作很多帶樣式的代碼教程。結(jié)合 Xcode 自帶的規(guī)范,可以達(dá)到和官方保持一致的效果。關(guān)于具體的標(biāo)記樣式可以查看文末的參考。

帶樣式的 Xcode 注釋
     /**
     The shorthand three-digit hexadecimal representation of color.
     #RGB defines to the color #RRGGBB.
     
     - parameter hex3: Three-digit hexadecimal value.
     - parameter alpha: 0.0 - 1.0. The default is 1.0.
     */
    public convenience init(hex3: UInt16, alpha: CGFloat = 1) {
        let divisor = CGFloat(15)
        let red     = CGFloat((hex3 & 0xF00) >> 8) / divisor
        let green   = CGFloat((hex3 & 0x0F0) >> 4) / divisor
        let blue    = CGFloat( hex3 & 0x00F      ) / divisor
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }

Travis CI

Travis CI,是一個(gè)專門為開源項(xiàng)目打造的持續(xù)集成環(huán)境。最為顯著的標(biāo)示就是在很多 GitHub 等開源的項(xiàng)目 README 中,有很多簡(jiǎn)介項(xiàng)目的標(biāo)簽。我也正準(zhǔn)備將自己的項(xiàng)目建立 Travis CI。

Travis CI 標(biāo)簽

十六進(jìn)制轉(zhuǎn) RGB

以六位十六進(jìn)制轉(zhuǎn)換 RGB 為例。& 是按位與運(yùn)算符。>> 是右移運(yùn)算符。通過 (hex6 & 0xFF0000) >> 16,(hex6 & 0x00FF00) >> 8,hex6 & 0x0000FF,分別把 RR、GG、BB 位上的數(shù)字提取。由于 RGB 最大值為 255.0,iOS 中 UIColor 的初始化方法必須按與 255.0 的比例作為參數(shù),因此比上除數(shù) 255.0。

/**
     The six-digit hexadecimal representation of color of the form #RRGGBB.
     
     - parameter hex6: Six-digit hexadecimal value.
     */
    public convenience init(hex6: UInt32, alpha: CGFloat = 1) {
        let divisor = CGFloat(255)
        let red     = CGFloat((hex6 & 0xFF0000) >> 16) / divisor
        let green   = CGFloat((hex6 & 0x00FF00) >>  8) / divisor
        let blue    = CGFloat( hex6 & 0x0000FF       ) / divisor
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }

參考資料

Error Handling
Extensions
Initialization
Markup Formatting Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 嗯哼嗯哼蹦擦擦~~~ 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 ...
    philiha閱讀 5,247評(píng)論 0 6
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,221評(píng)論 4 61
  • 夏季北方家里最常做的是面條,涼水過面,才好吃。蒜汁涼面,西紅柿雞蛋面,炸醬面,鹵面,茄子肉丁面等等,都是最愛! 【...
    修味閱讀 1,065評(píng)論 3 12
  • 九年不見的老同學(xué),阿寶,突然相見了。 復(fù)讀班同學(xué)~~ 咋辦? 喝一壺唄! 我這人沒原則,口口聲聲地說不喝酒了,但,...
    王小二日記閱讀 1,753評(píng)論 2 3
  • 第1天 各地-長(zhǎng)白山 08:00 交通: 【機(jī)場(chǎng)接機(jī)】自行抵達(dá)長(zhǎng)白山機(jī)場(chǎng),抵達(dá)后,出機(jī)場(chǎng)乘坐萬(wàn)達(dá)度假區(qū)統(tǒng)一安排巴士...
    健康牛牛媽閱讀 450評(píng)論 0 1

友情鏈接更多精彩內(nèi)容