Swift 将可选闭包传递给视图

Swift 将可选闭包传递给视图,swift,swiftui,closures,Swift,Swiftui,Closures,我创建了一个新的子视图,其中包含其他视图的标题。 它有一个箭头图标,我想给这个子视图传递一个闭包profileClose是一个函数: PlainHeader(title: getLocalizedText("edit profile"), action: profileClose) 问题是我希望这个闭包是可选的。。所以我决定把它包起来无,但在我每次使用PlainHeader时都这样做之后。。。。Xcode在调用中表示额外参数“action” 我做错了什么?我只想用它来结束

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

PlainHeader(title: getLocalizedText("edit profile"), action: profileClose) 
问题是我希望这个闭包是可选的。。所以我决定把它包起来无,但在我每次使用PlainHeader时都这样做之后。。。。Xcode在调用中表示额外参数“action”


我做错了什么?我只想用它来结束和不结束。。所以我将其设置为可选,并给它一个默认值nil..

将变量let更改为var

var action: (() -> Void)? = 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.
}
问题在于:

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.
}

@卢卢加:你为什么使用公共初始化?单个init完成了我认为完成的工作。让我知道为什么,或者我缺少什么?init也很好。@LuLuGaGa:为什么使用public init?单个init完成了我认为完成的工作。让我知道为什么,或者我遗漏了什么?init也很好。