Swift中的ios – didSet对突变功能有一个奇怪的敲击效应

Swift中的ios – didSet对突变功能有一个奇怪的敲击效应,第1张

概述我刚刚了解到,mutation只是一个curried func,第一个参数为inout,所以下面的代码将工作并将firstName更改为“John” struct Person { var firstName = "Matt" mutating func changeName(fn: String) { firstName = fn }}var p = 我刚刚了解到,mutation只是一个currIEd func,第一个参数为inout,所以下面的代码将工作并将firstname更改为“John”
struct Person {    var firstname = "Matt"    mutating func changename(fn: String) {        firstname = fn    }}var p = Person() let changer = Person.changenamechanger(&p)("John")p.firstname

但是奇怪的事情发生在我添加属性观察者p如下,你可以看到firstname还是“马特”,为什么?

一个有趣的注意事项是,观察者在召集公民之前被召唤:
struct Person {    var firstname = "Matt"    mutating func changename(fn: String) {        firstname = fn    }}var p: Person = Person() {    dIDSet {        print("p was set")    }}print("1: \(p.firstname)")let changer = Person.changenameprint("2: \(p.firstname)")let setter = changer(&p)print("3: \(p.firstname)")setter("John")print("4: \(p.firstname)")p.changename("John")print("5: \(p.firstname)")

打印:

1: Matt2: Mattp was set3: Matt4: Mattp was set5: John

所以似乎在inout结构体中获取setter方法会执行实际的突变。这通过inout参数如何在语义上工作来解释:当参数传递给函数时,它的值被复制到函数可以突变的地方。当函数返回时,该值将被复制回原始位置,触发setter观察者一次,该值是否改变。

当我们改变方式让预先填充的咖喱设定者:

let setter = p.changename

…编译器对象:

error: partial application of 'mutating' method is not allowed

看来,编译器了解到关闭inout值是一个坏主意,因为它基本上是对值类型进行引用。

闭包可以随时更改struct的值,即使编译器假定它是不变的。为了防止这种不幸的情况,编译器只是禁止关闭inout。

您发现一个愚弄编译器并围绕诊断工作的情况。这似乎是一个错误,应该提交。

简短版本:

struct Foo {    mutating func foo() {}}var f = Foo()let m = Foo.foolet s = m(&f)

最后两行之一应该发出一个错误,类似于让x = f.foo。

总结

以上是内存溢出为你收集整理的Swift中的ios – didSet对突变功能有一个奇怪的敲击效应全部内容,希望文章能够帮你解决Swift中的ios – didSet对突变功能有一个奇怪的敲击效应所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1052552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存