【发布时间】:2015-09-21 20:13:35
【问题描述】:
我正在编写一个异步字典,它返回一个 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?,因为
Protocol
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)?
}
【问题讨论】:
标签: swift generics delegates swift2 swift-protocols