如何检查可选的@ViewBuilder 内容

Posted

技术标签:

【中文标题】如何检查可选的@ViewBuilder 内容【英文标题】:How to check for Optional @ViewBuilder content 【发布时间】:2021-02-03 19:07:28 【问题描述】:

以下视图是 List() 的第一行,用于替换隐藏的导航栏。

左侧有一个后退导航按钮,中间有一个居中的标题,右侧有一个可选按钮。

父视图通过可选的@ViewBuilder 闭包负责可选的右键实现。

如果父视图没有实现任何右键,我需要提供一个默认的占位符框架以确保标题保持居中。

问题是如何检查闭包是否为空,因为将其与 EmptyView 进行比较会产生以下异常:

if self.content == EmptyView() 

二元运算符'=='不能应用于'()类型的操作数 -> 内容?'和“空视图”

并在下一个警告中将其与 nil 进行比较:

if self.content == nil 

比较 '() -> Content?' 类型的非可选值总是“零” 返回错误

import SwiftUI

struct TestTitle<Content: View>: View 
    @Environment(\.presentationMode) var presentation
    var caption:String
    let content: () -> Content?
    
    public init(_ caption:String, @ViewBuilder content: @escaping () -> Content? =  nil )  
        self.caption = caption
        self.content = content
    
    
    var body: some View 
        HStack() 
            Image(systemName: "chevron.backward")
                .onTapGesture 
                    self.presentation.wrappedValue.dismiss()
                
            
            Spacer()
            Text(self.caption)
            Spacer()
            
            **if self.content == nil** 
                Text(" ")
                    .frame(width:32)
             else 
                self.content()
            
        
    

【问题讨论】:

【参考方案1】:

在这里(使用 Xcode 12.4 测试)

if let content = content() 
        content

else 
    Text(" ")
        .frame(width:32)

【讨论】:

【参考方案2】:

一种可能的解决方案是将Content 类型与EmptyView 进行比较:

if Content.self == EmptyView.self 
    Text(" ")
        .frame(width: 32)
 else 
    self.content()

【讨论】:

以上是关于如何检查可选的@ViewBuilder 内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中比较两个可选的 NSArray

如何使 django 中的 FileField 成为可选的?

如何使 django 中的 FileField 成为可选的?

如何在 Node.js server.listen() 中使用可选的主机名参数

如何检查子节点是否不存在?

如何自定义 SwiftUI ViewBuilder