【发布时间】:2015-10-18 17:17:55
【问题描述】:
我正在尝试了解如何在 Swift 中实现命令模式。到目前为止,这段代码运行良好:
class Subject
{
var value: Int = 0
func setValue(value: Int) {
self.value = value
}
}
class Command<T>
{
private var receiver: T
private var instructions: T -> Void
init(receiver: T, instructions: T -> Void) {
self.receiver = receiver
self.instructions = instructions
}
func execute() {
instructions(receiver)
}
}
var subject = Subject()
println(subject.value) // "0"
let instructions: Subject -> Void = { sub in Subject.setValue(sub)(2) }
let command = Command<Subject>(receiver: subject, instructions: instructions)
command.execute()
println(subject.value) // "2"
但是,如果我希望接收器是 struct 而不是 class,则相同的代码不起作用。因此,如果我将 Subject 定义为 struct,如下所示:
struct Subject
{
var value: Int = 0
mutating func setValue(value: Int) {
self.value = value
}
}
然后我收到错误消息:let instructions: Subject -> Void = { sub in Subject.setValue(sub)(2) } 上的“主题不可转换为 inout 主题”。
我不知道如何处理这个问题。有什么建议吗?
【问题讨论】:
-
这可能很困难。请注意,Command init 方法中的
self.receiver = receiver已经制作了结构的独立副本。 -
如此真实......这让我想到如果我因为糟糕的设计理念而遇到这个问题。一般而言,将命令模式应用于结构(“值”)对象(?)也许没有多大意义(?)谢谢!
标签: swift command-pattern