1

我正在编写一个异步字典,它返回一个 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)?
}
4

2 回答 2

1

以您为例,您是否考虑过这样做:

protocol Delegate {
    func dataCallForDictionary<T: Hashable, U>(dictionary: MyDictionary<T, U>) -> T -> U
}

struct MyDictionary<Key: Hashable, Value> {
    var delegate: Delegate?
    var dataCall: ((key: Key) -> Value)?

    init(delegate: Delegate) {
        self.delegate = delegate
        dataCall = delegate.dataCallForDictionary(self)
    }
}
于 2015-09-22T15:39:25.067 回答
0

我认为MyDictionary结构中的委托应该很弱。

于 2018-06-19T02:39:37.450 回答