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)
在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)