繁体   English   中英

SwiftUI 为什么我不能将存储的属性设置为带有修饰符的视图?

[英]SwiftUI why can't I make a stored property a view with a modifier?

所以我有一个视图,我想在其中创建一个存储属性并为其添加一个修饰符,但是当我尝试这样做时:

var heyButton2 = Text("T").background(.red)

我收到此错误:属性定义已推断类型“某些视图”,涉及另一个声明的“某些”返回类型

现在,如果我将 heyButton2 设为计算属性,一切都会按预期工作,但有人可以解释为什么如果它是存储属性就不行了吗? 我只是不明白视图修饰符是如何工作的吗? 我正在创建一个文本视图并向其添加背景修饰符我不明白为什么这会导致任何问题。

还有另一个相关的问题,如果我从 heyButton2 中删除修饰符,那么就

var heyButton2 = Text("T")

我可以将 10 个 heyButton2 放在 VStack 或任何东西中,每个都将是“不同的”? 按钮? 对我来说这似乎有点奇怪,因为它只是一个包含 View 的变量,但我可以包含将它放入任何 View 十次或其他东西,它们都会有所不同,是否可以假设每次我放入 heyButton2一个 VStack 它只是创建按钮的副本? 就像原来的 heyButton2 是一个包含一个 View 的变量一样,但我放入 VStack 的每个变量都只是一个副本,这对吗?

这与视图无关; 你可能应该改写这个问题。 您不能对不透明类型进行类型推断。 例如

struct S {
  var bool = someExpressibleByBooleanLiteral
}

var someExpressibleByBooleanLiteral: some ExpressibleByBooleanLiteral { true }

通过显式键入some Protocol. 正如您所建议的,这不需要计算属性。 这只是一种选择。

您需要明确提供类型,例如

var heyButton2: some View = Text("T").background(.red)

因为Text生成已知的Text类型(您的第二个快照),但修饰符声明(几乎总是)未定义some View

使用 Xcode 13.4 测试

  1. 你不能运行这个语句var heyButton2 = Text("T").background(.red)因为background符合一些 View ,所以你必须告诉 SwiftUI var heyButton2: some View = Text("T").background(.red)符合某些视图,以便在没有任何错误的情况下运行该语句。 类似于声明视图的a bodya sub view时,您可以这样声明它:

代码:

 var heyButton2: some View {
 }

 var body: some View {
 }
  1. Text()是一个结构体 一个结构总是产生一个自己的新副本。 与类不同,它是按值传递的类型,因此您的所有结构都是独立副本而不是同一个结构。 每次调用 Text() 时,都会生成一个新的 Text() 副本,该副本不会将其数据链接到任何先前的文本。

我认为这个答案会对你有所帮助。 实际上这很奇怪但很简单,如果你看一下“背景”的定义,它有一个返回类型的一些视图。 因此返回类型必须是“视图”,但你的变量类型不是。 定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM