如何重用 socket.io emit 函数?尝试将套接字发射功能附加到 SwiftUI 按钮(操作)?

How can I reuse the socket.io emit function? Trying to attach the socket emit function to the SwiftUI button (action)?

我是 SwitftUI 的新手,Xcode。 我正在尝试重新使用 class -> init() 部分中的 send/emit 函数。 但是,当我尝试将函数调用到按钮(操作)中时,Xcode 会显示 'cannot find scope'。我意识到问题是因为我的函数在 'init()' 中。但是,我尝试并未能从 'init()'.

中提取行代码

'init()'、'let socket = manager.defaultSocket' 正下方的代码行无法从 init() 中拉出。当我将这段代码拉出到 class 部分时,我得到了 'socket' 之类的错误或没有 'emit' 这样的工作。 我被这个问题困了好几天了。

我试图将发射代码分组到一个函数中,将其放在一个按钮函数上,但Xcode不认识它,这是我的 sendmsg 函数,如果我带上,我会遇到很多编译错误这个函数来自 'init()'

func sendMsg(){
    socket.on(clientEvent: .connect){ (data, ack) in
        print("Connected")
        DispatchQueue.main.async{
            socket.emit("NodeJS Server Port","Hi server111")
            socket.emit("NodeJS Server Port","testing")
            sleep(UInt32(0.3))
    }}

This is the error I got when I put it into the button action

以下是我完整的工作代码,但尚未完成。我的代码能够连接、接收消息,但在连接时只能发送一次消息。我正在尝试从我的 SwiftUI 按钮向节点 js 连续发送消息。

import SwiftUI
import SocketIO
import zlib


final class Service: ObservableObject {

    @Published var manager = SocketManager(socketURL: URL(string:"ws://localhost:4044")!, config:[.log(true), .compress])
    @Published var messages = [String]()
    
   func sendMsgFunc(){
   }

    
    init(){
        let socket = manager.defaultSocket

        _sendMsg()
        func _sendMsg(){
            socket.on(clientEvent: .connect){ (data, ack) in 
                print("Connected")
                DispatchQueue.main.async{
                    socket.emit("NodeJS Server Port","Hi server111") 
                    socket.emit("NodeJS Server Port","testing") 
                    sleep(UInt32(0.3))
            }}}
        
        socket.on("iOS Client Port"){ [weak self] (data, ack) in //receive
            if let data = data[0] as? [String: String],
               let rawMessage = data["msg"] {  
                DispatchQueue.main.async{
                    self?.messages.append(rawMessage)
                    print(rawMessage)
                    socket.emit("NodeJS Server Port","msg received")
                    sleep(UInt32(0.3))
                    
                }
            }
            
        }
        socket.connect()
        
    }
    
}

struct ContentView: View {
    
    
    @ObservedObject var service = Service()
    @State var test: String = ""
    @State var textFieldText: String = ""
    @State var dataArray: [String] = []

    var body: some View { 
        
        VStack{
            Text("Received messages")
                .font(.largeTitle)
            
            Button("Click", action: service.sendMsgFunc)
            Button("Connect .2"){
                print("hello .2")
            }

            ForEach(service.messages, id: \.self) { msg in
                Text(msg).padding() // Receive from Js
            }
            
        }

    }
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
}


----------

let socket = ... 可以在任何需要的地方重复。所以,如果您需要它在 init 中,您可以将它包含在那里。如果您在 sendMsg() 中需要它,您也可以将其包含在其中。

因为您的代码中有一些不匹配的大括号,一点 很难准确地说出您希望一切发生的位置,但这似乎符合您的需要:

final class Service: ObservableObject {
    
    @Published var manager = SocketManager(socketURL: URL(string:"ws://localhost:4044")!, config:[.log(true), .compress])
    @Published var messages = [String]()
    
    init(){
        let socket = manager.defaultSocket
        sendMsg()
        socket.connect()
    }
    
    func sendMsg(){
        let socket = manager.defaultSocket
        
        socket.on(clientEvent: .connect){ (data, ack) in
            print("Connected")
            DispatchQueue.main.async{
                socket.emit("NodeJS Server Port","Hi server111")
                socket.emit("NodeJS Server Port","testing")
                sleep(UInt32(0.3))
            }}
        
        socket.on("iOS Client Port"){ [weak self] (data, ack) in //receive
            if let data = data[0] as? [String: String],
               let rawMessage = data["msg"] {
                DispatchQueue.main.async{
                    self?.messages.append(rawMessage)
                    print(rawMessage)
                    socket.emit("NodeJS Server Port","msg received")
                    sleep(UInt32(0.3))
                }
            }
        }
    }
}