当前位置: 首页 > 面试题库 >

类内部的变异函数

吴胜涝
2023-03-14
问题内容

考虑一下Swift中的此类:

class Zombie: Monster {
    var walksWithLimp = true

    final override func terrorizeTown()
    {
        town?.changePopulation(-10)
        super.terrorizeTown()
    }

    func changeName(name: String, walksWithLimp: Bool)
    {
        self.name = name
        self.walksWithLimp = walksWithLimp
    }
}

僵尸继承了Monster类的名称字段。

var name = "Monster"

为什么

fredTheZombie.changeName("Tom", walksWithLimp: true)

即使在函数头之前没有mutation关键字也能工作吗?


问题答案:

从语言指南-
方法中

从实例方法中修改值类型

结构和枚举是 类型。默认情况下,不能从其实例方法中修改值类型的属性。

但是,如果需要在特定方法中修改结构或枚举的属性,则可以选择对该方法进行行为更改。然后,该方法可以从方法内部更改(即更改)其属性,并在方法结束时将其所做的任何更改写回到原始结构。该方法还可以为其隐式self
属性分配一个全新的实例,并且该新实例将在方法结束时替换现有实例。

您可以通过将mutating关键字放在该方法的func关键字之前来选择这种行为…

因此,我们需要包含关键字mutating以允许
类型的成员(例如函数†)对其成员进行变异(例如a的成员属性)。对值类型实例的成员进行突变意味着对值类型实例本身()进行突变,而对 引用
类型实例的成员进行突变并不意味着对引用类型实例(被视为)的引用进行了突变。 struct``self self

因此,由于a
class是Swift中的引用类型,因此即使类中的实例成员或类发生突变,我们也无需mutatingZombie该类的任何实例方法中都包含关键字。如果我们要说的是改变实际的类实例fredTheZombie,我们将提到改变其实际
引用 (例如指向另一个Zombie实例)。

[†]:作为另一个示例,我们可以使用例如mutatinggetters(get);
在这种情况下,我们需要对此进行显式标记,因为nonmutating默认情况下是这些标记。set另一方面,Setters()是mutating默认设置,因此mutating即使它们使值类型的成员发生突变,也不需要关键字。



 类似资料:
  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 我只是想学习Angular 2(特别是Angular 8),就我的一生而言,我不明白为什么类变量在类函数中是“未定义”的,但如果我用ES6风格编写函数,它是可以访问的。 我尝试在构造函数中设置,但这没有意义。 一旦调用HandleClickStart,每1.5秒输出一次NaN。为什么????我本以为是1 2 3...... 通过这种方式实现handleClickStart,可以获得预期的结果: 但

  • 我有一个组件,我将一些数据放入变量中,以便在另一个函数中读取它。当我在构造函数中打印这个变量并在控制台上打印它时,我可以看到它,但是当我在另一个函数中执行同样的操作时,我没有定义它。我已经尝试将它声明为私有和公共,并得到相同的结果。 如何声明此变量以查看另一个方法中的变量? 这是我的组件: 编辑: 如果我把一个静态常数放在我的函数上,我可以得到数据: 但如果我这样做: 我得到了一个错误: 属性'm

  • 问题内容: 为什么我需要声明一个方法,好像我在方法中定义的需要使用它一样? 范例: } 为什么String 需要是最终常量?它如何影响? 问题答案: 答案是两者在不同的范围内。因此该变量可以在内部类访问它之前更改。将其最终确定可以防止这种情况。

  • 问题内容: 在内部类中,可以访问外部类的变量,但不能访问方法的局部变量。我了解了无法访问方法的局部变量的部分,但我想知道为什么外部类变量可以访问? 我的理解是,由于内部类与外部类绑定,因此只要父级可用,子级就可以访问其父级变量。我对么? 问题答案: 假设您的外部类在内部类的范围内(非静态)被称为,以获取该字段。 例如, 其中Outer是类的名称,并标识该字段。 您也可以直接抓取它,但是如果由于阴影

  • 在内部类中,外部类的变量是可访问的,但方法的局部变量不是。我理解了关于方法的局部变量不可访问的部分,但我想知道为什么外部类变量是可访问的? 我的理解是,由于内部类与外部类绑定,因此只要父类可用,子类就可以访问其父变量。我说得对吗?