在 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")