これは私が欲しいものです。私は非常に簡単なevent dispatcherを書いています(私のコードを見るにはそのリンクをクリックしてください)。私がlisten()
とfire()
の方法しか持っていなかったときにうまくいきました。これは、あなたがそれを使用することができる方法である:クラスプロパティ配列をジェネリック型の異種配列にするにはどうすればよいですか?
struct UserHasBirthday: Event {
let name: String
init(name: String) {
self.name = name
}
}
let events = TestDispatcher()
events.listen {
(event: UserHasBirthday) in
print("Happy birthday \(event.name)!")
}
events.fire(UserHasBirthday(name: "John Doe"))
すべてが順調と良いのですが、今私はあなたがキューにイベントをプッシュし、後で一度にすべてを発射できた機能を追加したいと。そのため、私はpushメソッドとflushメソッドを追加しました。
ここで問題は、flush()
メソッドでは、指定された特定のイベントタイプに汎用のEvent
タイプをダウンキャストできなければならないということです。そうでないと、fire()
メソッドは機能しません。
私はおそらく、イベント情報と同じ配列に型情報を保存できると考えました。ご覧のとおり、私はタプルでそれをしようとしました。残念ながら、それはそのように動作しません。
私は、変数pushedEvents
のような汎用型を受け入れる方法を見つけることができたと思う:var pushedEvents = Array<E: Event>()
それは動作する可能性があります。しかし、私が知る唯一の方法は、汎用クラスをクラス全体に割り当てることです:class TestDispatcher<E: Event> { }
ですが、そのクラスのすべてのインスタンスは1つの特定のタイプのイベントにしか使用できません。
誰かがこの仕事をするために何らかの方法を知っていますか?
感謝を。それはイベントのディスパッチャーがほんの少しのイベントに限定されていれば、私にとっては役に立たないものですから、それは私のためにカットするつもりはありません。その場合は、プッシュ/フラッシュ機能を持っていないと思います。 私はあなたにそれを周回させました。なぜなら、おそらくそれのまわりに他の方法はないからです。しかし、私はあなたの答えをまだ受け入れられていないとマークしていません。なぜなら、これはいくつかのハッキーなやり方でやり遂げることができるという希望に執着しているからです。私は一般的なタイプアリアを作成するためにenumを使用したのと同じです。 – Evert
@Evert私はそれを理解することができます。また、この質問を1日程度開いたままにしておくことをお勧めします。誰かがより価値のあるハッキー入力を与えることができるかもしれません(私は「_possibly_これは、上記のように実際に私が考えなかった構造ラッパーの回避策があるかもしれません。 – dfri
あなたが興味を持っている場合に備えて、私は実際の回答[ここ](http://stackoverflow.com/a/36242803/1498652)を投稿しました。 – Evert