IOS : 如何直接在方法的参数中覆盖委托?

IOS : How can I override a delegate directly in the parameters of a method?

在java中,可以直接在方法的参数中覆盖一个对象:

myView.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(@NonNull View view, @NonNull MotionEvent event) {
        return true;
    }
});

我想用 Swift 做同样的事情,例如:

let joinSocket: GCDAsyncSocket = GCDAsyncSocket(delegate: GCDAsyncSocketDelegate {
    func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {

    }
    
    func sendValue(str: String) {

    }
    
    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {

    }
    
    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {

    }
    
    func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {

    }
}, delegateQueue: .main)

但是上面的代码returns这个错误:

'GCDAsyncSocketDelegate' cannot be constructed because it has no accessible initializers

如何使用 swift 5.0 直接在方法的参数中覆盖委托?

GCDAsyncSocketDelegate 是一个协议。您需要提供所述协议的实现,然后您才能按照自己的意愿构建它。

class DefaultGCDAsyncSocketDelegate: GCDAsyncSocketDelegate {
    func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {

    }
    
    func sendValue(str: String) {

    }
    
    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {

    }
    
    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {

    }
    
    func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {

    }
}

let joinSocket: GCDAsyncSocket = GCDAsyncSocket(delegate: DefaultGCDAsyncSocketDelegate(), delegateQueue: .main)