Swift3.0 指针 & sizeof()

作者: YxxxHao | 来源:发表于2016-10-17 15:56 被阅读989次

    0 -> 1 这个系列的文章里面,主要为了记录自己从 设计 --> 开发 --> 上架 一款产品,主要有图像处理和绘图两大功能,使用 Swift 作为开发语言,也是自己从 OC 转到 Swift 的第一步,有兴趣的可以关注下。

    Swift3.0 指针

    在 OC 里的一个 HSV 转 RGB 的方法里使用了指针传值:

    void HSVtoRGB(float h, float s, float v, float *r, float *g, float *b)
    {
        if (s == 0) {
            *r = *g = *b = v;
        } else {
            // ......
        }
    }
    

    在 Swift 里没有了 * ,用 UnsafeMutablePointer 来取代,看过 swift 基础的都大概应该知道它怎么使用,把它直接翻译过来就成了这样了:

    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 {
                // ......
            }
        }
    

    在方法里面通过 .pointee 来改变 UnsafeMutablePointer 的值,调用的方法如下:

    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 是一门比较简洁的语言,而这个方法感觉比 OC 的写法更加复杂难懂,现在尝试来封装下,比如说把 HSV 和 RGB 封装成一个 struct,直接传入一个结构体,处理完再返回结构体就可以了,于是我们可以定义:

    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
    }
    

    再看该方法,有没有发现该方法都是针对 HSVColor 的实例对象做处理的,而 HSVColor 则是我们自定义的结构体,所以,我们可以直接将该方法扩展为 HSVColor 的实例方法:

    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 同时应该提供一个默认的 init 方法和一个设置参数的 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 里面,如果有更好的方法来取代指针的时候,建议还是尽量少用指针。

    sizeof()

    swift 中的 sizeof() 移动 MemoryLayout 中,MemoryLayout 中还可以获取 stride 和 alignment:

    MemoryLayout<Float>.size
    MemoryLayout<RGBColor>.size
    MemoryLayout<RGBColor>.stride
    MemoryLayout<RGBColor>.alignment
    
    MemoryLayout.size(ofValue: "swift")

    相关文章

      网友评论

        本文标题:Swift3.0 指针 & sizeof()

        本文链接:https://www.haomeiwen.com/subject/exfzyttx.html