2016-07-31 51 views
0

我想在swift3中編寫一個基本插值函數。不過,我收到了很多錯誤。這顯然不是使用泛型的正確方法,但也許我對它們的應用有一個根本性的誤解。如何編寫一個採用泛型類型參數的函數,但基於泛型對象的類型返回不同的類型?

class func interpolate<T>(from: T, to: T, progress: CGFloat) -> T 
{ 
    // Safety 
    assert(progress >= 0 && progress <= 1, "Invalid progress value: \(progress)") 

    if let from = from as? CGFloat, let to = to as? CGFloat 
    { 
     return from + (to - from) * progress // No + candidates produce the expected contextual result type 'T' 
    } 
    if let from = from as? CGPoint, let to = to as? CGPoint 
    { 
     var returnPoint = CGPoint() 
     returnPoint.x  = from.x + (to.x-from.x) * progress 
     returnPoint.y  = from.y + (to.y-from.y) * progress 
     return returnPoint // Cannot convert return expression of type 'CGPoint' to return type 'T' 
    } 
    if let from = from as? CGRect, let to = to as? CGRect 
    { 
     var returnRect = CGRect() 
     returnRect.origin.x  = from.origin.x + (to.origin.x-from.origin.x) * progress 
     returnRect.origin.y  = from.origin.y + (to.origin.y-from.origin.y) * progress 
     returnRect.size.width = from.size.width + (to.size.width-from.size.width) * progress 
     returnRect.size.height = from.size.height + (to.size.height-from.size.height) * progress 
     return returnRect // Cannot convert return expression of type 'CGRect' to return type 'T' 
    } 

    return nil // Nil is incompatible with return type 'T' 
} 
+5

你嘗試的通用方法在http://stackoverflow.com/questions/38652237/how-can-i-handle-different-types-using-generic-type-in​​建議 - 快捷? –

+0

這個答案只是擴展我所關心的具有內插函數的類的一種更長的方式,這正是我現在正在做的一項權衡措施。它也沒有回答爲什麼我嘗試不起作用的問題。 – GoldenJoe

回答

2

當你有幾個不同的類型執行相同的操作時,通用函數很有用。這基本上就是你在這裏所擁有的。問題是您沒有爲您關心的兩種類型定義操作,即CGPointCGRect

如果您創建單獨的函數來添加,減少和乘以這些類型,則可以使該通用函數有效。這將簡化爲

class func interpolate<T>(from: T, to: T, progress: CGFloat) -> T 
{ 
    // Safety 
    assert(0.0...1.0 ~= progress, "Invalid progress value: \(progress)") 

    return from + (to - from) * progress 
} 
+0

將內插類中的+和 - 操作符重載,以便我可以使用這個簡化版本,會被認爲是一種不好的模式嗎?如果傳入的類型不支持操作員,是否有安全的方法? – GoldenJoe

+0

編輯:無所謂,試圖超載運營商給我://否+候選人產生預期的上下文結果類型'T' – GoldenJoe