我如何通过一个可选的函数与SwiftUI视图?



我试图在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()
} ...

最新更新