我正在编写一个异步字典,它返回一个 Future 的值:
- 如果它已经被缓存,则立即,或者
- 在(网络)操作之后(如果还没有)
我班级里的字典是通用的,所以班级也是。目前,用户必须阅读文档并知道设置dataCall
函数,这就是字典如何知道如何获取键值的方式,形式为
var dataCall: ((key: Key) -> Future<Value, MyError>)?
但这需要其他程序员了解数据调用并进行设置。所以我写了一个协议
protocol CacheDelegate {
typealias T: Hashable
typealias U
func dataCallForCacheManager(cacheManager: CacheManager<T, U>) → (key: T) → Future<Value, MyError>
}
但是,如果我尝试将其init()
称为
delegate.dataCallForCacheManager(self)
我得到错误
无法
dataCallForDictionary
使用类型为“(CacheManager)”的参数列表调用
我也不能做一个var delegate: CacheDelegate?
因为
协议
CacheDelegate
只能用作通用约束,因为它具有 Self 或关联的类型要求。
因此,我发现自己陷入困境,无法将自己作为参数传递,也无法设置委托来从该协议获取数据调用。我错过了什么吗?我愿意做 Swift 2 Voodoo。
一个玩具示例的内容(没有 Futures 和字典等)如下:
import Foundation
protocol Delegate {
typealias T: Hashable
typealias U
func dataCallForDictionary(dictionary: MyDictionary<T, U>) -> (T) -> (U)
}
struct MyDictionary<Key: Hashable, Value> {
typealias T = Key
typealias U = Value
init<Object: Delegate>(delegate: Object) {
dataCall = delegate.dataCallForDictionary(self)
// self.delegate = delegate
}
var delegate: Delegate?
var dataCall: ((key: Key) -> Value)?
}