我正在使用自定义的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,这使我认为我忽略了某些内容,或者这可能是编译器中的错误。
如果有人知道解决方法,或者可以看到我做错了事,请告知我。
谢谢。
答案 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的嵌套调用,这将使得不可能返回相同的类型。