2015-10-25 69 views
3

我創建保存3個浮點值的結構,是否有可能以編程方式添加函數定義在迅速

struct Col { 
    var r: Float 
    var g: Float 
    var b: Float 
} 

,我想補充一堆等效於內置函數定義數學函數,但在我的結構

我可以自己動手完成它的成員操作分段,例如

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)) 
} 

但這是繁瑣且容易出錯。

我希望做的是創建一個函數來把原有的數學函數到我中校版,這樣我就可以這樣調用它:

defineColVersion(pow, noArgs: 2) 

,它定義了新的版本,不覆蓋內置功能,雙倍運行

有什麼辦法可以在Swift中做到這一點?

感謝

+0

如果我的理解正確,實例方法或類型方法應該適合您的問題。 – Leviathlon

+0

你不能用泛型來做到這一點,泛型也不能解決像這樣的事情。 Swift是一個類型安全的語言,如果這是Javascript,它可以在一秒鐘內解決,但是當您想要在編譯時獲得struct/class的任何成員的引用時,Swift類型檢查,並且您可能很容易理解該類型T(實際上是佔位符)具有(應該有)沒有成員'r','g'或'b'。 – Leviathlon

回答

5

其實,我覺得這正是你想要的東西:

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) 

兩個重載函數toCol採取一元/二進制功能Float s並返回一個新功能,它在Col類型上執行相同操作。有了這兩個,您可以輕鬆地爲您的Col類型創建一個pow函數。

+0

是的。這正是我想要的。 我甚至沒有嘗試它,因爲我假設 讓pow = toCol(Darwin.pow) 會覆蓋需要雙打的版本,但它實際上超載了它:) – user3261886

0
func init(first: Col, second: Col, function: (Float, Float) -> Float) { 
    newR = function(first.r,second.r) 
    newG = function(first.g,second.g) 
    newB = function(first.b,second.b) 
    return self.init(r:newR,g:newG,b:newB) 
} 

我不是在一個位置,編譯此所以它可能有一些錯誤,但希望這將是有益的。你會這樣使用它:

first = Col(r:1,g:2,b:3) 
second = Col(r:1,g:2,b:3) 
combined = Col(first:first,second:second) { pow($0,$1) } 
3

這是不可能的以編程方式定義像Swift這樣的靜態語言的新功能。你能做什麼,但是,是使-kinded更高的功能:

func init(a: Col, b: Col, function: (Float, Float) -> Float) -> Col { 
    return self.init(r: function(a.r, b.r), g: function(a.g, b.g), b: function(a.b, b.b)) 
} 

Col(Col(1, 2, 3), Col(3, 4, 5)) { $0 * $1 } 
Col(Col(1, 2, 3), Col(3, 4, 5)) { pow($0, $1) } 
+0

這就是我要做的,只是對Swift結構初始化語法進行了一些修正: 'init(_ a:Col,_ b:Col,_ function:(Float,Float) - > Float){' 'self.init(r:function(ar,br),g:function(ag,bg),b:function(ab,bb))' '}' – user3261886

相關問題