Swift 如何编写一个接受泛型类型参数但根据泛型对象返回不同类型的函数';s型是什么?
我正在尝试用swift3编写一个基本的插值函数。不过,我犯了很多错误。这显然不是使用泛型的正确方法,但也许我对它们的应用有一个根本性的误解Swift 如何编写一个接受泛型类型参数但根据泛型对象返回不同类型的函数';s型是什么?,swift,swift3,generic-type-argument,Swift,Swift3,Generic Type Argument,我正在尝试用swift3编写一个基本的插值函数。不过,我犯了很多错误。这显然不是使用泛型的正确方法,但也许我对它们的应用有一个根本性的误解 class func interpolate<T>(from: T, to: T, progress: CGFloat) -> T { // Safety assert(progress >= 0 && progress <= 1, "Invalid progress value: \(progr
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'
}
class func interpolate(from:T,to:T,progress:CGFloat)->T
{
//安全
assert(progress>=0&&progress当您在几个不同的类型上执行相同的操作时,通用函数非常有用。这基本上就是您在这里所做的。问题是您没有为您关心的两种类型定义操作,即CGPoint
和CGRect
如果您创建单独的函数来对这些类型进行加法、减法和乘法,您可以使这个通用函数工作
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
}
class func interpolate(from:T,to:T,progress:CGFloat)->T
{
//安全
断言(0.0…1.0~=进度,“无效进度值:\(进度)”)
返回自+(至-自)*进度
}
当您在几个不同的类型上执行相同的操作时,通用函数非常有用。这基本上就是您在这里所做的。问题是您没有为您关心的两种类型定义操作,即CGPoint
和CGRect
如果您创建单独的函数来对这些类型进行加法、减法和乘法,您可以使这个通用函数工作
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
}
class func interpolate(from:T,to:T,progress:CGFloat)->T
{
//安全
断言(0.0…1.0~=进度,“无效进度值:\(进度)”)
返回自+(至-自)*进度
}
您是否尝试了中建议的通用方法?该答案只是扩展我所关心的类以具有插值函数的一种更长的方法,这是我现在作为权宜之计所做的。它也没有回答为什么我尝试的方法无效的问题。您尝试了中建议的通用方法吗?该答案是jus扩展我所关心的类的一种更长的方法是使用插值函数,这是我现在作为权宜之计所做的。它也没有回答为什么我尝试的方法不起作用的问题。如果在插值类中重载+和-运算符,这样我就可以使用这个简化的版本,这会被认为是一种不好的模式吗n?如果传入的类型不支持运算符,有没有办法安全地跳出?Edit:Nevermind,尝试重载运算符会给我://No+候选者生成预期的上下文结果类型“t”如果只重载interpolate类中的+和-运算符,这样我就可以使用这个simplifie,这会被认为是一种不好的模式吗d版本?如果传入的类型不支持运算符,是否有方法安全地跳出?编辑:Nevermind,尝试重载运算符会给我://No+候选者生成预期的上下文结果类型“t”