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?ので

ProtocolCacheDelegateは、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 に答える