我正在创建一个包含3个浮点值的结构,
struct Col {
var r: Float
var g: Float
var b: Float
}
Run Code Online (Sandbox Code Playgroud)
我想添加一堆与内置数学函数等效的函数定义,但它对我的struct的成员进行逐段操作
我可以手工完成,例如
func pow(a: Col, b: Col) -> Col {
return Col(r: pow(a.r, b.r), g: pow(a.g, b.g), b: pow(a.b, b.b))
}
Run Code Online (Sandbox Code Playgroud)
但这很乏味且容易出错.
我想要做的是创建一个函数将原始数学函数转换为我的Col版本,这样我就可以这样调用它:
defineColVersion(pow, noArgs: 2)
Run Code Online (Sandbox Code Playgroud)
它定义了新版本,而不会覆盖在双打上运行的内置函数
在Swift中有什么办法吗?
谢谢
我实际上认为这正是你想要的:
func toCol(f: (Float, Float) -> Float) -> (Col, Col) -> Col {
return { a, b in
Col(r: f(a.r, b.r), g: f(a.g, b.g), b: f(a.b, b.b))
}
}
func toCol(f: Float -> Float) -> Col -> Col {
return { c in
Col(r: f(c.r), g: f(c.g), b: f(c.b))
}
}
let pow = toCol(Darwin.pow)
let sin = toCol(Darwin.sin)
let log = toCol(Darwin.log)
let a = Col(r: 0.4, g: 0.2, b: 0.7)
let b = Col(r: 0.3, g: 0.9, b: 0.3)
pow(a, b)
sin(a)
log(b)
Run Code Online (Sandbox Code Playgroud)
两个重载函数toCol在Floats 上采用一元/二元函数,并返回一个新函数,它在您的Col类型上执行相同的操作.有了这两个,您可以轻松地pow为您的Col类型创建一个功能.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |