Swift 视图中不可变的某些视图主体变量/不透明返回

Swift 视图中不可变的某些视图主体变量/不透明返回,swift,swiftui,Swift,Swiftui,在Swift 5.1中,存在不透明类型。我发现,例如,body是一个必需的协议变量。其合同定义如下: var body: Self.Body { get } 这意味着我们应该能够将body标记为不可变(noset)。必须如何做到这一点?不透明变量类型是否可能是不可变的?我试过: import SwiftUI struct ContentView : View { init() { body = AnotherView(body: Text("")) }

在Swift 5.1中,存在不透明类型。我发现,例如,
body
是一个必需的协议变量。其合同定义如下:

var body: Self.Body { get }
这意味着我们应该能够将body标记为不可变(no
set
)。必须如何做到这一点?不透明变量类型是否可能是不可变的?我试过:

import SwiftUI

struct ContentView : View {

    init() {
        body = AnotherView(body: Text(""))
    }

    let body: some View
}

struct AnotherView: View {
    var body: Text
}
但是我得到一个错误,
另一个视图
必须强制转换到
某个视图
。执行此操作后,我得到错误信息:

“某些”类型仅为声明的属性类型实现 和下标以及函数的返回类型


我是否能够使用类型为
某些视图
(未将其显式标记为
另一个视图
)的不可变
主体
变量符合
视图
AnotherView
some视图
,我不明白为什么不能将
AnotherView
的实例分配给
body
。我想保持灵活性,不在结构外部公开主体的实际实现类型,但我想直接在初始值设定项内部初始化它(因为我在初始值设定项内部传递值,生成更多属性并在主体属性中使用它们是冗长的)。

因为没有setter,任何值类型的
body
实现都是不可变的。
var
只是意味着
body
是惰性计算的,而不是说它是可变的。您可以声明
let body
,但正如您所指出的,这将公开底层
视图的实现:

public结构静态文本视图:视图{
公共机构:文本
公共初始化(字符串:字符串){
self.body=文本(字符串)
}
}
解决此问题的一种方法是让
body
只返回一个内部私有值,如下所示:

public结构静态文本视图:视图{
私人出租文本视图:文本
公共变量主体:某些视图{textView}
公共初始化(字符串:字符串){
self.textView=文本(字符串)
}
}
但是,您应该记住,
body
被设计为在任何绑定状态更改时动态运行,如果您希望将视图指定给常量,则视图层次结构中的任何内容都不能绑定到任何动态状态。例如,这是不可能的:

struct DynamicStepperView:View{
@状态变量stepperValue=1
var body:一些观点{
步进器(值:$stepperValue,in:1…11,标签:{Text(“当前值:\(stepperValue)”)})
}
}
如果您主要关心的是防止视图层次结构的实现细节泄漏,请注意,
some view
的不透明返回类型对于代码的任何客户端来说确实是不透明的,他们将无法看到底层实现的任何细节,除非它符合
视图
协议