[英]Function declares an opaque return type 'some View', but the return statements in its body do not have matching underlying types
[英]"Function declares an opaque return type [...]" error when declaring a view as a variable inside the body of a View in SwiftUI
假設我有一個帶有shadow
屬性的Image
的View
:
struct ContentView: View {
var body: some View {
Image("turtlerock").shadow(radius: 10)
}
}
現在想象我想訪問陰影半徑的值。 我以為我可以這樣做:
struct ContentView: View {
var body: some View {
let myImage = Image("turtlerock").shadow(radius: 10)
print(myImage.modifier.radius)
}
}
但是,這會返回錯誤:
函數聲明了一個不透明的返回類型,但它的主體中沒有返回語句來推斷底層類型
有沒有辦法以某種方式完成這個?
修改和構建視圖時,您可以在沒有 return 語句的情況下執行此操作,並且可以在沒有逗號的情況下將構建塊放在另一個之上。 這稱為多語句閉包。 當您嘗試在多語句閉包中創建變量時,編譯器會抱怨,因為類型不匹配(您只能一個接一個地組合視圖,僅此而已)。 有關更多詳細信息,請參閱此答案: https : //stackoverflow.com/a/56435128/7715250
解決此問題的一種方法是顯式返回您正在組合的視圖,因此您不會使用多閉包語句:
struct MyView: View {
var body: some View {
let image = Image("Some image").shadow(radius: 10)
let myRadius = image.modifier.radius
// Do something with myRadius
return image // No multi closure statements.
}
}
如果要引用的視圖位於堆棧內,則應在堆棧外聲明它,如下所示:
var body: some View {
let myImage = Image("image").shadow(radius: 10)
let stack = HStack {
myImage
Image("image2")
}
return stack
}
您可以定義身體外的圖像:
let myImage = Image("turtlerock").shadow(radius: 10)
var body: some View {
myImage
}
要打印半徑,您可以這樣做:
var body: some View {
myImage
.tapAction {
print(self.myImage.modifier.radius) // 10.0
}
}
當它發生在我的測試環境中時,我只是將身體中的所有東西都嵌套在一個
return ZStack{ ...}
有點快速和骯臟,但它適用於我的目的。
我正在使用Group {}
:
func makeContentView() -> some View {
Group {
if some_condition_here {
Text("Hello World")
.foregroundColor(.red)
.font(.system(size: 13, weight: .bold, design: .monospaced))
} else {
Rectangle()
.fill(Color.gray20)
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.