Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何编写一个接受泛型类型参数但根据泛型对象返回不同类型的函数';s型是什么?_Swift_Swift3_Generic Type Argument - Fatal编程技术网

Swift 如何编写一个接受泛型类型参数但根据泛型对象返回不同类型的函数';s型是什么?

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

我正在尝试用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'
}
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”