gpt4 book ai didi

SwiftUI - 我可以为通用 View 定义一个空的初始值设定项吗?

转载 作者:行者123 更新时间:2023-12-03 21:43:05 25 4
gpt4 key购买 nike

我有一个可选的通用 View @ViewBuilder .
我想要两个初始化器,一个负责设置@ViewBuilder另一个应该作为空的默认值。

struct OptionalViewBuilder<Content: View>: View {

let content: (() -> Content)?

init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}

init() {
self.content = nil
}

var body: some View {
VStack {
Text("Headline")
Divider()
content?()
}
}
}
如果我使用 ViewBuilder 参数初始化 View ,它当然可以工作。但是,当我使用空初始值设定项时,我收到错误消息:

Generic parameter 'Content' could not be inferred

struct ContentView: View {
var body: some View {
OptionalViewBuilder {
Text("Text1")
Text("Text2")
}
OptionalViewBuilder() // <-- Generic parameter 'Content' could not be inferred
}
}
我知道 Swift 在运行时需要显式类型,但是有没有办法让默认初始化程序正常工作?

最佳答案

因为 OptionalViewBuilder关于它的 Content 是通用的类型,您需要将该类型定义为默认情况下的内容。这可能是 EmptyView ,如果你不想渲染任何东西。
为此,您需要一个 init这被限制为 Content == EmptyView ,以及 content属性不必是可选的:

struct OptionalViewBuilder<Content: View>: View {

let content: () -> Content

init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}

init() where Content == EmptyView {
self.init(content: { EmptyView() })
}

var body: some View {
VStack {
Text("Headline")
Divider()
content()
}
}
}

关于SwiftUI - 我可以为通用 View 定义一个空的初始值设定项吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66215607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com