Swift3.0 指针 & sizeof()

在 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, g: UnsafeMutablePointer, b: UnsafeMutablePointer) {
        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.size
MemoryLayout.size
MemoryLayout.stride
MemoryLayout.alignment

MemoryLayout.size(ofValue: "swift")

你可能感兴趣的:(Swift3.0 指针 & sizeof())