Swift 视图中不可变的某些视图主体变量/不透明返回
在Swift 5.1中,存在不透明类型。我发现,例如,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("")) }
body
是一个必需的协议变量。其合同定义如下:
var body: Self.Body { get }
这意味着我们应该能够将body标记为不可变(noset
)。必须如何做到这一点?不透明变量类型是否可能是不可变的?我试过:
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
的不透明返回类型对于代码的任何客户端来说确实是不透明的,他们将无法看到底层实现的任何细节,除非它符合视图
协议