【发布时间】:2018-04-06 11:17:13
【问题描述】:
我有一个简单的应用程序,它使用自定义协议通过 TCP 套接字与服务器通信。我想实现类似 HTTP 的响应请求行为,从套接字层抽象出来。 所以我有简单的协议:
protocol ResponseType {
init(with frame: SocketMessage)
}
还有一些例子:
struct MessageAck: ResponseType {
var messageId: String
init(with frame: SocketMessage) {
messageId = frame.messageId
}
}
我为发送请求创建了简单的协议:
protocol APIClient {
func send<T: ResponseType>(request: SocketAPIRequest, completion: ((Result<T>) -> Void)?)
}
enum SocketAPIRequest {
case textMessage(messageId: String, ...)
...
}
最后:
enum Result<T> {
case success(T)
case failure(Error)
}
class SocketAPIClient: APIClient {
typealias MessageId = String
private var callbacks = [Receipt: ((Result<ResponseType>) -> Void)]()
...
func send<T>(request: SocketAPIRequest, completion: ((Result<T>) -> Void)?) where T : ResponseType {
....
callbacks[stompFrame.receiptId] = completion
....
}
}
所以,当我想为每个请求存储回调,在收到应答后调用它,我得到了这样的错误:
Cannot assign value of type '((Result<T>) -> Void)?' to type '((Result<ResponseType>) -> Void)?'
我猜是混合类型和对象的问题,或者可能是别的什么。
【问题讨论】:
标签: ios swift generics closures