swift2 将self作为参数传递给协议函数,该函数需要与self作为参数的类型相同

7kqas0il  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(195)

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

hfyxw5xn1#

以您为例,您是否考虑过:

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)
    }
}
uqcuzwp8

uqcuzwp82#

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

相关问题