实现允许用户插入其他视图的闭包的正确语法是什么?

问题描述 投票:0回答:1

我想实现一个闭包

additionalContent
,允许调用类向视图添加额外的 UI:

struct RandomView: View
{
    private var additionalContent: (() -> some View)?
    
    var body: some View
    {
        Text("1")
        
        if let additionalContent = self.additionalContent
        {
            additionalContent
        }
        
        Text("2")
    }
}

但是,我收到错误“Type '() -> some View' 无法符合 'View' “在可选件解开包装后。

我尝试过使用“任何视图”和“视图”作为参数,结果是一样的。尝试将 @ViewBuilder 添加到属性声明中,但它抱怨需要添加 getter?完成此操作的正确语法是什么?

swift swiftui closures
1个回答
0
投票

additionalContent
是一个返回
some View
的闭包,因此您只需调用该闭包即可。

if let additionalContent
{
    additionalContent()
}

也就是说,在内置 SwiftUI 视图中更常见的是在初始化程序中获取闭包并立即在初始化程序中调用它。另外,使用

EmptyView
而不是可选的来表示缺少附加内容。

struct RandomView<Content: View>: View
{
    private let additionalContent: Content
    
    init(@ViewBuilder additionalContent: () -> Content) {
        self.additionalContent = additionalContent()
    }
    
    init() where Content == EmptyView {
        self.additionalContent = EmptyView()
    }
    
    var body: some View
    {
        Text("1")
        additionalContent
        Text("2")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.