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

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

发布时间:2020-12-14 05:50:42 所属栏目:百科 来源:网络整理
导读:我刚刚了解到,mutation只是一个curried func,第一个参数为inout,所以下面的代码将工作并将firstName更改为“John” struct Person { var firstName = "Matt" mutating func changeName(fn: String) { firstName = fn }}var p = Person() let changer = Pe
我刚刚了解到,mutation只是一个curried func,第一个参数为inout,所以下面的代码将工作并将firstName更改为“John”
struct Person {
    var firstName = "Matt"

    mutating func changeName(fn: String) {
        firstName = fn
    }
}
var p = Person() 
let changer = Person.changeName
changer(&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.changeName
print("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: Matt
2: Matt
p was set
3: Matt
4: Matt
p was set
5: 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.foo
let s = m(&f)

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

(编辑:李大同)

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

    推荐文章
      热点阅读