【问题标题】:"Function declares an opaque return type [...]" error when declaring a view as a variable inside the body of a View in SwiftUI在 SwiftUI 中将视图声明为视图主体内的变量时出现“函数声明不透明的返回类型 [...]”错误
【发布时间】:2019-10-23 15:41:39
【问题描述】:

假设我有一个 View 和一个 Image 有一个 shadow 属性:

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)
    }
}

但是,这会返回错误:

函数声明了一个不透明的返回类型,但它的主体中没有返回语句来推断基础类型

有没有办法做到这一点?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    在修改和构建视图时,您可以在不使用 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.
        }
    }
    

    【讨论】:

    • 非常感谢,您已经解释了一切!我已经编辑了我的原始问题,只解决了一个问题,我将创建第二个处理访问修饰符变量的问题。我建议编辑此答案以仅包含后半部分,并在另一个问题下的答案中包含有关访问修饰符的信息。
    • 这是另一个问题:stackoverflow.com/q/56506318/3151675
    【解决方案2】:

    如果您要引用的视图位于堆栈内,则应将其声明为堆栈外,如下所示:

    var body: some View {
        let myImage = Image("image").shadow(radius: 10)
    
        let stack = HStack {
            myImage
            Image("image2")
        }
    
        return stack
    }
    

    【讨论】:

      【解决方案3】:

      您可以定义身体外部的图像:

      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
        }
      }
      

      【讨论】:

      • 这个答案也是正确的print(self.myImage.modifier.radius) // 10.0为什么要投反对票?
      • @PrashantTukadiya 我赞成这个答案,有人反对。
      【解决方案4】:

      当我在测试环境中遇到这种情况时,我只是将身体中的所有内容都嵌套在一个

      return ZStack{ ...}
      

      有点快速和肮脏,但它适用于我的目的。

      【讨论】:

        【解决方案5】:

        我正在使用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)
                    }
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多