加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

无法在Swift中实现这种设计模式?

发布时间:2020-12-14 04:37:12 所属栏目:百科 来源:网络整理
导读:我知道这个模式有一个名字,不记得它是什么.基本上有一个方法返回一个瞬态/蹦床的东西,通过API操纵原始.调解员可能吗? 我试图在Swift playground中的一个简单示例中实现它: struct Count { var value = 0 func adjuster() - Adjuster { return Adjuster(tar
我知道这个模式有一个名字,不记得它是什么.基本上有一个方法返回一个瞬态/蹦床的东西,通过API操纵原始.调解员可能吗?

我试图在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 value
f.adjuster().increment(13)
~~^~~~~~~~~~

我并不完全了解这里的问题.它也不能为我“修复它”.那么这里发生了什么?如何实现这种模式?

解决方法

您必须将struct更改为class才能使其正常工作.

因为struct是按值复制的,所以在这一行中

return Adjuster(target:self)

调整器将获得目标的新副本并保存.在increment方法中,您正在尝试修改self.target.value,这意味着您正在修改self.target,因此基本上修改self.

但是还有更多问题,因为struct是值类型,所以

var count: Count // count.value = 0
var 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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读