我试图在Swift playground中的一个简单示例中实现它:
struct Count { var value = 0 func adjuster() -> Adjuster { return Adjuster(target:self) }}struct Adjuster { var target:Count func increment(delta:Int) { self.target.value = self.target.value + delta }}var f = Count()f.adjuster().increment(13)
这样做的第一件事是有帮助地告诉我,增量方法需要标记为变异.我有点不清楚为什么.如果它改变它自己的var,我会明白为什么,而不是另一个的var.那好吧.所以我让IDE为我插入变异.但后来它与最后一行“测试”案件有关.它会产生以下错误:
...: error: cannot use mutating member on immutable value: function call returns immutable valuef.adjuster().increment(13)~~^~~~~~~~~~
我并不完全了解这里的问题.它也不能为我“修复它”.那么这里发生了什么?如何实现这种模式?
解决方法 您必须将struct更改为class才能使其正常工作.因为struct是按值复制的,所以在这一行中
return Adjuster(target:self)
调整器将获得目标的新副本并保存.在increment方法中,您正在尝试修改self.target.value,这意味着您正在修改self.target,因此基本上修改self.
但是还有更多问题,因为struct是值类型,所以
var count: Count // count.value = 0var adjuster = count.adjuster()adjuster.increment(1)
您将期望count.value为1,但事实并非如此. count.value将保持为0,adjuster.target.count将为1.您现在的代码现在非常混乱,您想知道什么是错的.
真正的问题是你正在用OOP实现设计模式和纯函数模式的原语,所以它们不能很好地协同工作.
如果您想要遵循一些最佳实践指南并且更喜欢结构而不是类,那么您也可以使用功能方法.即没有突变
struct Count { let value = 0}func increment(count:Count,delta:Int) -> Count { return Count(value:count.value + delta)}总结
以上是内存溢出为你收集整理的无法在Swift中实现这种设计模式?全部内容,希望文章能够帮你解决无法在Swift中实现这种设计模式?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)