我正在编写一个异步字典,它返回一个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)
我收到错误
无法使用类型为“(CacheManager)”的参数列表调用dataCallForDictionary
我也无法生成var delegate: CacheDelegate?
,因为
协议CacheDelegate
只能用作一般约束,因为它具有Self或关联的类型要求。
所以我发现自己陷入了一个困境,我不能把自己作为一个参数传递,我不能设置一个委托来从这个协议中获取我的数据调用。我错过了什么吗?我愿意做斯威夫特2伏都教。
一个玩具示例的内容(没有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)?
}
2条答案
按热度按时间hfyxw5xn1#
以您为例,您是否考虑过:
uqcuzwp82#
我认为
MyDictionary
结构中的委托应该是弱的。