簡體   English   中英

在 SwiftUI 中將視圖聲明為視圖主體內的變量時出現“函數聲明不透明的返回類型 [...]”錯誤

[英]"Function declares an opaque return type [...]" error when declaring a view as a variable inside the body of a View in SwiftUI

假設我有一個帶有shadow屬性的ImageView

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM