Tôi đang thử nghiệm kiến trúc dựa trên thông điệp trong Swift. Tôi đang cố gắng làm một cái gì đó tương tự như kiến trúc Elm, ví dụ. Đây là cách mã của tôi trông:Tin nhắn chung trong kiến trúc dựa trên tin nhắn
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 []
}
}
}
Vì vậy, nhà nước được mô hình hóa bởi State
và bạn có thể thay đổi nó bằng cách gửi Message
s. Nếu có bất kỳ tác dụng phụ nào để tính toán, chúng sẽ được trả lại dưới dạng thông báo SideEffect
và sẽ được người khác chăm sóc. Mỗi thông báo SideEffect
nhận đối số “gọi lại”, Message
để gửi khi hiệu ứng phụ hoàn tất. Điều này làm việc tuyệt vời.
Bây giờ, điều gì sẽ xảy ra nếu tôi muốn có thông báo hiệu ứng phụ chung? Tôi muốn có một cái gì đó như thế này:
struct Request<ReturnType> { … }
Và có một tác dụng phụ liên quan đến tải các yêu cầu và trả về một giá trị kiểu ReturnType
:
enum SideEffect<Message> {
case sendRequest(Request<T>, (T) -> Message)
}
Nhưng điều này (rõ ràng) không biên dịch , vì số case
sẽ phải chung chung trên T
. Tôi không thể tạo toàn bộ số SideEffect
chung trên T
, vì có các tác dụng phụ khác không liên quan gì đến T
.
Tôi có thể bằng cách nào đó tạo thông báo SideEffect
với số Request<T>
mà sau này gửi đi Message
với T
? (Tôi nghĩ rằng tôi muốn một cái gì đó như this feature discussed on swift-evolution.)
Làm thế nào về chúng ta thực hiện một Giao thức 'Returnable' và làm cho 'ReturnType' phù hợp với giao thức này ? Sau đó, chúng ta cũng có thể mở rộng các kiểu khác, như 'String', để phù hợp với giao thức này. – sCha
Bạn sẽ muốn xóa 'T', thường có thể được thực hiện với các đóng (ví dụ bạn đóng một cửa sổ để thực hiện yêu cầu và sau đó chuyển kết quả đến hàm của bạn để tạo ra một thông báo, do đó ẩn kiểu' T' từ thế giới bên ngoài). Tôi không quen thuộc với kiến trúc Elm và do đó không chắc chắn bạn đang mong đợi 'Yêu cầu' được thực hiện như thế nào, nhưng sẽ [một cái gì đó như thế này] (http://swift.sandbox.bluemix.net/#/ repl/59e15aad6cbea87f72c470cc) có khả thi không? – Hamish
Hamish để giải cứu một lần nữa! Tôi nghĩ đó là chính xác những gì tôi cần. Tôi đã đánh bại loại tẩy xoá, nhưng dường như tôi không quen với khái niệm này nên tôi không nghĩ ra giải pháp. Cảm ơn nhiều! Tôi đã gắn cờ câu hỏi để nhận xét của bạn được chuyển đổi thành câu trả lời. – zoul