栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么常量要约束结构实例而不是类实例的属性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么常量要约束结构实例而不是类实例的属性?

Swift中的结构是值类型
–从语义上讲,值(即值类型的“实例”)是不可变的。

值类型的突变,无论是通过直接更改属性的值,还是通过使用

mutating
方法,都等同于为保存该值的变量分配一个 全新的
值(以及该突变触发的任何副作用)。因此,保存该变量的变量必须为
var
。正如iGodric指出的那样,属性值周围的属性观察者的行为很好地展示了这种语义。

因此,这意味着您可以想到以下几点:

struct Foo {    var bar = 23    var baz = 59}// ...let foo = Foo()foo.bar = 7 // illegal

这样做:

let foo = Foo()var fooCopy = foo // temporary mutable copy of foo.fooCopy.bar = 7   // mutate one or more of the of the propertiesfoo = fooCopy     // re-assign back to the original (illegal as foo is declared as       // a let constant)

您可以清楚地看到–该代码是非法的。您不能将其赋值

fooCopy
foo
-这是一个
let
常数。因此,您不能更改声明为a的值类型的属性,
let
因此需要将其设置为a
var

(值得注意的是,编译器实际上并没有经过该操作程序;它可以直接更改结构的属性,这可以通过查看生成的SIL来看到。但这不会更改值类型的语义。)


您可以更改

let
常量 实例的可变属性的原因是由于类是引用类型。因此,为
let
常数只能确保 参考
保持不变。更改它们的属性不会以任何方式影响您对它们的引用-您仍在引用内存中的 相同 位置。

您可以将引用类型视为路标,因此代码如下:

class Foo {    var bar = 23    var baz = 59}// ...let referenceToFoo = Foo()

您可以想到这样的内存表示形式:

|    referenceToFoo     |  --->  | Underlying Foo instance || (a reference to 0x2A) |        |<----------------------->||0x2A       |0x32         |0x3A|  bar: Int |  baz : Int  ||     23    |      59     |

而当您更改属性时:

referenceToFoo.bar = 203

参考(

referenceToFoo
本身 不受影响–您仍指向内存中的同一位置。更改的是基础实例的属性(这意味着基础实例已更改):

|    referenceToFoo     |  --->  | Underlying Foo instance || (a reference to 0x2A) |        |<----------------------->||0x2A       |0x32         |0x3A|  bar: Int |  baz : Int  ||    203    |      59     |

仅当您尝试分配 新的 引用

referenceToFoo
时,编译器才会在尝试更改引用本身时给您一个错误:

// attempt to assign a new reference to a new Foo instance to referenceToFoo.// will produce a compiler error, as referenceToFoo is declared as a let constant.referenceToFoo = Foo()

因此,为了使该分配合法,您需要先进行“

referenceToFoo
设置”
var



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483216.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号