如何在SwiftUI中编写函数,从视图的用户处获取回调(函数类型),以便用户可以链接函数调用?

如何在SwiftUI中编写函数,从视图的用户处获取回调(函数类型),以便用户可以链接函数调用?,swiftui,Swiftui,我希望从我的结构中公开符合视图协议的函数,这样结构的用户就可以链接函数调用 下面是我写的 struct MyResuableView: View { var event1Callback: () -> Void = {} var event2Callback: () -> Void = {} var body: some View { Text("Resuable View") } mut

我希望从我的结构中公开符合视图协议的函数,这样结构的用户就可以链接函数调用

下面是我写的

struct MyResuableView: View {
    var event1Callback: () -> Void = {}
    var event2Callback: () -> Void = {}
    
    var body: some View {
        Text("Resuable View")
    }
    
    mutating func onEvent1(action: @escaping () -> Void) -> Self {
        self.event1Callback = action
        return self
    }

    mutating func onEvent2(action: @escaping () -> Void) -> Self {
        self.event2Callback = action
        return self
    }
}
这就是我希望使用它的方式

struct MyView: View {
    var body: some View {
        VStack {
            Text("My View")
            MyResuableView()
                .onEvent1(action: self.event1Handler)
                .onEvent2(action: self.event2Handler)
        }
    }
    
    private func event1Handler() {
        
    }
    
    private func event2Handler() {
        
    }
}
我得到下面的编译错误
无法对不可变值使用mutating成员:函数调用返回不可变值
,这是可以理解的

我看着线。这是实现的方法之一,但如何公开像onEvent1(..)和onEvent2(..)这样的函数,以将函数作为调用者的输入


所以我只是想知道我需要做什么(如果可以的话)来实现我想要的东西???

你可以按照视图修改器的工作方式来构建它。每次都返回一个新视图:

struct MyReusableView: View {
    let event1Callback: () -> Void
    let event2Callback: () -> Void
    
    init(event1Callback: @escaping () -> Void = {}, event2Callback: @escaping () -> Void = {})
    {
        self.event1Callback = event1Callback
        self.event2Callback = event2Callback
    }
    
    var body: some View {
        Text("Reusable View")
    }
    
    func onEvent1(action: @escaping () -> Void) -> Self {
        .init(event1Callback: action, event2Callback: self.event2Callback)
    }

    func onEvent2(action: @escaping () -> Void) -> Self {
        .init(event1Callback: self.event1Callback, event2Callback: action)
    }
}

可以按照视图修改器的工作方式对其进行构造。每次都返回一个新视图:

struct MyReusableView: View {
    let event1Callback: () -> Void
    let event2Callback: () -> Void
    
    init(event1Callback: @escaping () -> Void = {}, event2Callback: @escaping () -> Void = {})
    {
        self.event1Callback = event1Callback
        self.event2Callback = event2Callback
    }
    
    var body: some View {
        Text("Reusable View")
    }
    
    func onEvent1(action: @escaping () -> Void) -> Self {
        .init(event1Callback: action, event2Callback: self.event2Callback)
    }

    func onEvent2(action: @escaping () -> Void) -> Self {
        .init(event1Callback: self.event1Callback, event2Callback: action)
    }
}
这里有一种可能的方法(回想一下,视图只是一个值)

这里有一种可能的方法(回想一下,视图只是一个值)