私はSwiftのメッセージベースのアーキテクチャを試しています。私は、例えばElm Architectureに似た何かをしようとしています。これは私のコードがどのように見えるかです:メッセージベースのアーキテクチャの一般的なメッセージ
enum SideEffect<Message> {
case sendRequest((String) -> Message)
}
protocol Component {
associatedtype Message
mutating func send(msg: Message) -> [SideEffect<Message>]
}
struct State: Component {
var something: String?
enum Message {
case downloadSomething
case receiveResponse(String)
}
mutating func send(msg: Message) -> [SideEffect<Message>] {
switch msg {
case .downloadSomething:
return [.sendRequest(Message.receiveResponse)]
case .receiveResponse(let response):
something = response
return []
}
}
}
ので状態はState
によってモデル化されていて、Message
Sを送信することによって、それを変更することができます。計算する副作用がある場合は、SideEffect
メッセージとして返され、他の誰かが世話をします。各SideEffect
メッセージは、コールバック引数を受け取り、副作用が終了すると、Message
が送信されます。これは素晴らしいです。
一般的な副作用メッセージを表示するにはどうすればよいですか。
struct Request<ReturnType> { … }
、要求をロードして、タイプReturnType
の値を返すために、関連する副作用があります:私はこのような何かがしたい
enum SideEffect<Message> {
case sendRequest(Request<T>, (T) -> Message)
}
をしかし、これは(明らかに)コンパイルされません。 case
はT
より一般的でなければならないからです。 T
とは関係のないその他の副作用があるので、私は全体をT
以上にすることはできません。
Request<T>
のSideEffect
メッセージを作成し、後でMessage
をT
とディスパッチすることはできますか。 (私はthis feature discussed on swift-evolutionのようなものが欲しいと思います)
我々はプロトコル 'Returnable'を作ると' ReturnType'は、このプロトコルに適合させる方法について?次に、 'String'のような他の型もこのプロトコルに準拠するように拡張することができます。 – sCha
あなたは '' T 'を消去したいと思うでしょう。これは通常、クロージャで行うことができます(例えば、リクエストを実行するクロージャを作成し、その結果を関数に渡してメッセージを生成し、 '' T "を外界から受け入れる)。私はエルムアーキテクチャに精通していないので、あなたは 'Request'がどのように実装されるのかは不明ですが、[これと似たようなものです](http://swift.sandbox.bluemix.net/#/ repl/59e15aad6cbea87f72c470cc)は実行可能ですか? – Hamish
もう一度救助にハミッシュ!私はそれが私が必要としていたものだと思う。私はタイプ消去の周りに拍手していたが、明らかに私はそのコンセプトに慣れていないので、私は解決策を思い付かなかった。どうもありがとうございました!私はあなたのコメントを回答に変換させる質問にフラグを立てました。 – zoul