将可选的闭包传递给视图
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.
}
我为其他视图创建了一个包含 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.
}