将可选的闭包传递给视图

Passing optional closure to the View

我为其他视图创建了一个包含 header 的新子视图。 它有一个箭头图标,我想向这个子视图传递一个闭包(profileClose 是一个函数):

PlainHeader(title: getLocalizedText("edit profile"), action: profileClose) 

问题是我希望这个闭包是可选的。所以我决定将它包装到 () ? = nil 但在我每次使用 PlainHeader(...) 时都这样做了。 Xcode 说 "Extra argument 'action' in call"

import SwiftUI

struct PlainHeader: View {
    var title: String
    let action: (() -> Void)? = nil
    
    var body: some View {
        
        VStack(spacing: 0) {
                        
            ZStack {
                
                VStack(spacing: 0) {
                    HStack {
                        Image("arrow-back")
                            .resizable()
                            .scaledToFit()
                            .frame(width: 18, height: 7)
                            .padding(.leading, 31)
                        Spacer()
                    }
                    .onTapGesture {
                        print("[debugUI] action called")
                        if self.action != nil {
                            self.action!()
                        }
                    }
                }
                VStack {
                    HStack {
                        Text("\(title)")
                            .lineLimit(nil)
                            .multilineTextAlignment(.center)
                            .frame(maxWidth: 280)
                            .font(.custom(Font.primaryTextFont, size: 20))
                            .foregroundColor(Color.mainSubtitleColor)
                    }
                }
                
            }
            .padding(.top, 20)
        }
        .frame(height: 80)
        
    }
}

我做错了什么?我只是想在有和没有关闭的情况下使用它..所以我将它设置为可选并给它一个默认值 nil..

将变量 let 更改为 var.

var action: (() -> Void)? = nil

问题在这里:

let action: (() -> Void)? = nil

您将其声明为let,并立即将其设置为nil,因此无法再次初始化。

您可以将其声明为 var 或更好地编写初始化程序:

struct PlainHeader: View {
    private let title: String
    private let action: (() -> Void)?

    public init(title: String,
                action: (() -> Void)? = nil) {
        self.title = title
        self.action = action
    }
    //etc.
}