Swift2 在以后的Swift 2.0中存储回调函数

Swift2 在以后的Swift 2.0中存储回调函数,swift2,Swift2,我有两个函数,func1和func2。当有人呼叫时,应检查插座是否连接。如果套接字未连接,则应将该函数附加到处理程序数组,并在连接套接字时调用该函数 func func1(data: NSData) { if(!socket.isConnected()) { // how to do here ↓ handlers.append(func1) startConnectSocket() return; }

我有两个函数,
func1
func2
。当有人呼叫时,应检查插座是否连接。如果套接字未连接,则应将该函数附加到处理程序数组,并在连接套接字时调用该函数

func func1(data: NSData) {
    if(!socket.isConnected()) {
        //  how to do here ↓
        handlers.append(func1) 

        startConnectSocket()
        return;
    }
    socket.writeData(data, withTimeout: 0, tag: 0)
}

func func2(data1:NSData , data2:NSData) {
    if(!socket.isConnected()){
        //  how to do here ↓
        handlers.append(funky) 

        startConnectSocket()
        return;
    }
    socket.writeData(data1 + data2, withTimeout: 0, tag: 0)
}
连接套接字后,调用存储在处理程序中的所有函数

func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    //  how to do here ↓
    for function in handlers {
        // call function
    }
}

您不仅要保存对
函数的引用
,还要保存
数据
参数。 因此,您需要将其包装到闭包中:

var handlers: [() -> ()] = []

func func1(data: NSData) {
    if(!socket.isConnected()) {
        handlers.append({ func1(data) }) 

        startConnectSocket()
        return;
    }
    socket.writeData(data, withTimeout: 0, tag: 0)
}

func func2(data1: NSData, data2: NSData) {
    if(!socket.isConnected()){
        handlers.append({ func2(data1, data2) }) 

        startConnectSocket()
        return;
    }
    socket.writeData(data1 + data2, withTimeout: 0, tag: 0)
}

func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    for function in handlers {
        function()
    }
}

VaR处理程序= [(-)->()]()这一行显示了通过更改为var处理程序而固定的错误:[(-]->())][]有更好的方法吗?另一种考虑这一点的方法是使用依赖关系的NSR作业,它有效地实现了“承诺”设计。创建一个连接到套接字的操作,另一个用于执行func1(取决于第一个操作),另一个用于执行func2(可能取决于func1或仅取决于套接字操作)。对于异步、依赖的操作,它通常是一个很好的体系结构。wwdc在这方面有一个很好的演讲。