Swift3.0 指針 & sizeof()

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")
最后編輯于
?著作權(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)容

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