首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >变化莫测和变化莫测--它们的含义是什么?

变化莫测和变化莫测--它们的含义是什么?
EN

Stack Overflow用户
提问于 2017-03-01 17:30:58
回答 2查看 1.7K关注 0票数 0

让我们从一些代码段开始

代码语言:javascript
运行
复制
struct DigitS {
    var number = 42
    init(_ n: Int) {
        self.number = n
    }
    mutating func replace() {
        self = DigitS(12) // mutating 
    }
}

class DigitC {
    var number = 42
    init(_ n: Int) {
        self.number = n
    }
    func replace() {
        self = DigitC(12) //#Cannot assign to value: "self" is immutable
    }
}

很长一段时间以来,我对可变、可修改的含义感到非常困惑。以下是我迄今为止的一些理解,如果你能指出它可能存在的所有错误,那就太好了。

  1. 上述结构类型中的变异函数不会“变异”实例,它将用一个全新的变量替换变量的旧值。
  2. 变异手段:像赋值、初始化或变异函数这样的操作不会修改当前值,而是触发替换。
  3. 类类型变量的值是不可变的,但是您可以修改/更改当前值(这就是编译器发出警告的原因,请参阅注释和#)
  4. 只有当类型是值类型时,才能调用setter观察者,因为setter告诉变量是否已发生变异/替换(请参见下面的代码)。 结构数字{ var number = 12 } var b=位(){ didSet{ print(“set") }} b.number = 22 //观察者称为类数字{ var数= 12 } var b=位(){ didSet{ print("number is set") }} b.number = 22 //观察者不调用

谢谢你的时间和帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-01 18:16:50

使用图像更好地解释处理内存问题,但我将在这里介绍一下:

  1. 你说得对,它实际上改变了存储在变量位置的数据。

给出了一个简单的结构,并给出了一个变体:

代码语言:javascript
运行
复制
struct Example {
    var text: String

    mutating func changeText(to newText: String) {
        self.text = newText
    }
}

let constantExample = Example(text: "Test") //Makes a section of memory that isn't allowed to change.
constantExample.changeText(to: "Other Test") //This doesn't work because constantExample isn't mutable.

var mutableExample = Example(text: "Test") //Makes a section of memory that is allowed to change.
mutableExample.changeText(to: "Other Test") //This doesn't make a new copy, but rather changes the value in mutableExample's section of memory

如果您要使用您提到的特定情况:

代码语言:javascript
运行
复制
mutating func changeText(to newText: String) {
    self = Example(text: "A new text")
}

mutableExample仍然驻留在同一个内存位置,但是您正在手动创建一个全新的示例实例,然后将该数据从该实例复制到mutableExample。

  1. 相反:)变异改变了实例的位置。您可以通过复制不同的值(如self =示例中的情况)来更改该实例,但是实例仍然是同一个实例,只是具有不同的值。
  2. 在创建类变量时,您正在创建对内存部分的引用。当设置或更改该引用var variableName = classInstance时,一旦初始化,引用的位置将保持不变,但是所引用的位置(如果是var)可以更改。
  3. 你在功能上是正确的,但遗漏了一些细微之处。在struct示例中,如前所述,实例的实际值正在发生变化。在类示例中,引用的内存正在更改,但存储在b中的实际值不会更改。
票数 2
EN

Stack Overflow用户

发布于 2017-03-01 18:39:20

观察者观察值的变化,类类型变量的值是对象的引用点。要触发属性观察者,必须更改引用。

代码语言:javascript
运行
复制
    class Digit {
        var number = 12
    }

    var a = Digit()

    var b = Digit() {
        didSet{ print("number is set") }
    }

    b.number = 22 // observer is called

    b = a //observer is called here!!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42538273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档