从函数返回SwiftUI(已转换)路径的问题

时间:2020-06-01 17:58:59

标签: swift swiftui

我正在使用自定义的SwiftUI按钮,该按钮的形状取决于配置。

实用程序功能必须根据配置返回形状。由于路径/形状的编程很复杂,因此需要使用变换来获取取决于配置的变化。

出于演示目的,实用程序功能的简化版本如下所示:

func shape(i: Int) -> some Shape {

        let path = Path()

        switch i {
        case 0:
            return path
        case 1:
            return path.transform(CGAffineTransform(translationX:0,y:0))
        default:
            break
        }

        return path
    }

不幸的是,编译器生成了众所周知的错误:

Function declares an opaque return type, but the return statements in its body do not have matching underlying types

我确定这是由于转换而发生的,尽管它返回了一个结构

func transform(_ transform: CGAffineTransform) -> TransformedShape<Self>
符合Shape的

(如Path一样):

struct TransformedShape<Content> where Content : Shape

Path的文档指出Path符合Shape,这使我认为我忽略了某些内容,或者这可能是编译器中的错误。

如果有人知道解决方法,或者可以看到我做错了事,请告知我。

谢谢。

3 个答案:

答案 0 :(得分:3)

问题是您承诺返回一个特定类型,但是返回两种不同的类型:Path和TransformedShape。要解决此问题,在您不想更改形状的情况下,请始终通过应用CGAffineTransform.identity返回TransformedShape。例如,在您的情况下:

func shape(i: Int) -> some Shape {

    let path = Path()

    switch i {
    case 0:
        return path.transform(.identity)
    case 1:
        return path.transform(CGAffineTransform(translationX:0,y:0))
    default:
        break
    }

    return path.transform(.identity)
}

尽管我可能会这样写(假设还有更多的情况,并且零平移转换只是为了演示):

func shape(i: Int) -> some Shape {

    let transform: CGAffineTransform
    switch i {
    case 1:
        transform = CGAffineTransform(translationX:0, y:0)
    default:
        transform = .identity
    }

    return Path().transform(transform)
}

some类型并不意味着“任何符合的类型”。它们是不透明的类型,这意味着“此函数返回一些特定的,已知的编译时类型,但不要告诉调用者它是什么精确类型。”

答案 1 :(得分:1)

使用size = 132, view = 'City', type = 'Double', and basicRates = 120返回

时,必须在所有分支中返回相同的具体类型。

在您的情况下,我将设置身份转换,以便您始终使用相同的类型。

或者,您可以删除类型。根据您的操作,可能会导致性能问题。

some

如果您将此操作作为SwiftUI View层次结构的一部分,那么当它检查视图树的这一部分时,您将放慢差异。如果可以帮助您,则不要这样做。

答案 2 :(得分:0)

受许多有用答案的启发,我决定寻求一种完全使用CGAffineTransform设置转换的解决方案。这样可以避免SwiftUI的TransformedShape的嵌套调用,这将使得不可能返回相同的类型。