次の値で 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?
ので
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)?
}