我试图在SwiftUI中创建一个子视图,可以从父视图中选择一个函数,以便我可以执行逻辑,如果操作action
当我尝试运行我的代码时,我得到在调用中缺少参数'action'的参数我不知道为什么,因为我在ChildView中将action标记为可选所以如果在ParentView中声明时缺失了它应该没问题吗?
我在ChildView的公共初始化器中将action标记为@escaping,以满足编译器在点击"Fix"后的要求。在不知道为什么或是否应该的情况下添加@escaping ?
如果我不将action标记为@escaping,我会得到错误将非转义参数'action'分配给@escaping闭包
也许公共初始化是导致我的问题,但我需要包括在我的情况下,但认为我初始化可选函数不正确?
我怎样才能完成我想做的事??
父视图
struct ParentView: View {
var body: some View {
ChildView() // ERROR: Missing argument for parameter 'action' in call???
}
}
子视图
struct ChildView: View {
let action: () -> ()?
// ^ Should not have to be supplied since marked as optional??
public init(action: @escaping () -> ()? ) {
self.action = action
}
var body: some View {
VStack {
Text("Tap")
.onTapGesture {
if action != nil {
action()
} else {
print("No function was given to child view")
}
}
}
}
问题是你没有声明一个可选的函数,而是一个返回一个可选的Void(不管它是什么:)的函数。要使它成为可选的,你需要把它用圆括号
括起来let action: (() -> ())?
并以同样的方式更改init,现在action
参数实际上是可选的,@escaping
不再需要了。现在我们也可以给参数
public init(action: (() -> ())? = nil ) {
self.action = action
}
可以使用ChildView()
调用视图您还应该更改action
的用法:
if let action {
action()
} ...