由于種種原因,簡(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 是一個(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)記樣式可以查看文末的參考。

/**
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。

十六進(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