在 0 -> 1 這個(gè)系列的文章里面,主要為了記錄自己從 設(shè)計(jì) --> 開發(fā) --> 上架 一款產(chǎn)品,主要有圖像處理和繪圖兩大功能,使用 Swift 作為開發(fā)語(yǔ)言,也是自己從 OC 轉(zhuǎn)到 Swift 的第一步,有興趣的可以關(guān)注下。
Swift3.0 指針
在 OC 里的一個(gè) HSV 轉(zhuǎn) RGB 的方法里使用了指針傳值:
void HSVtoRGB(float h, float s, float v, float *r, float *g, float *b)
{
if (s == 0) {
*r = *g = *b = v;
} else {
// ......
}
}
在 Swift 里沒(méi)有了 * ,用 UnsafeMutablePointer 來(lái)取代,看過(guò) swift 基礎(chǔ)的都大概應(yīng)該知道它怎么使用,把它直接翻譯過(guò)來(lái)就成了這樣了:
static func HSVtoRGB(h: Float, s: Float, v: Float, r: UnsafeMutablePointer<Float>, g: UnsafeMutablePointer<Float>, b: UnsafeMutablePointer<Float>) {
if s == 0 {
r.pointee = v
g.pointee = v
b.pointee = v
} else {
// ......
}
}
在方法里面通過(guò) .pointee 來(lái)改變 UnsafeMutablePointer 的值,調(diào)用的方法如下:
var r: Float = 0.0
var g: Float = 0.0
var b: Float = 0.0
CPUtilities.HSVtoRGB(h: 0.7, s: 1.0, v: 1.0, r: &r, g: &g, b: &b);
swift 是一門比較簡(jiǎn)潔的語(yǔ)言,而這個(gè)方法感覺(jué)比 OC 的寫法更加復(fù)雜難懂,現(xiàn)在嘗試來(lái)封裝下,比如說(shuō)把 HSV 和 RGB 封裝成一個(gè) struct,直接傳入一個(gè)結(jié)構(gòu)體,處理完再返回結(jié)構(gòu)體就可以了,于是我們可以定義:
struct HSVColor {
var hue: Float
var saturation: Float
var brightness: Float
var alpha: Float
}
struct RGBColor {
var red: Float
var green: Float
var blue: Float
var alpha: Float
}
新方法則類似于:
static func HSVtoRGB(hsv: HSVColor) -> RGBColor {
var rgb: RGBColor
// ......
return rgb
}
再看該方法,有沒(méi)有發(fā)現(xiàn)該方法都是針對(duì) HSVColor 的實(shí)例對(duì)象做處理的,而 HSVColor 則是我們自定義的結(jié)構(gòu)體,所以,我們可以直接將該方法擴(kuò)展為 HSVColor 的實(shí)例方法:
extension HSVColor {
func toRGBColor() -> RGBColor {
var rgb = RGBColor.init()
if saturation == 0 {
rgb.red = brightness
rgb.green = brightness
rgb.blue = brightness
} else {
// ......
}
return rgb
}
}
而 HSVColor 同時(shí)應(yīng)該提供一個(gè)默認(rèn)的 init 方法和一個(gè)設(shè)置參數(shù)的 init 方法,完整的代碼如下:
struct HSVColor {
var hue: Float
var saturation: Float
var brightness: Float
var alpha: Float
init(hue: Float, saturation: Float, brightness: Float, alpha: Float) {
self.hue = hue
self.saturation = saturation
self.brightness = brightness
self.alpha = alpha
}
init() {
self.hue = 0
self.saturation = 0
self.brightness = 0
self.alpha = 1
}
}
struct RGBColor {
var red: Float
var green: Float
var blue: Float
var alpha: Float
init(red: Float, green: Float, blue: Float, alpha: Float) {
self.red = red
self.green = green
self.blue = blue
self.alpha = alpha
}
init() {
self.red = 0
self.green = 0
self.blue = 0
self.alpha = 1
}
}
extension HSVColor {
func toRGBColor() -> RGBColor {
var rgb = RGBColor.init()
if saturation == 0 {
rgb.red = brightness
rgb.green = brightness
rgb.blue = brightness
} else {
// ......
}
return rgb
}
}
在 swift 里面,如果有更好的方法來(lái)取代指針的時(shí)候,建議還是盡量少用指針。
sizeof()
swift 中的 sizeof() 移動(dòng) MemoryLayout 中,MemoryLayout 中還可以獲取 stride 和 alignment:
MemoryLayout<Float>.size
MemoryLayout<RGBColor>.size
MemoryLayout<RGBColor>.stride
MemoryLayout<RGBColor>.alignment
MemoryLayout.size(ofValue: "swift")