为什么Swift中的字符串,数组和字典更改为值类型

Jus*_*tin 18 objective-c value-type reference-type swift

在Objc字符串中,数组和字典都是引用类型,而在Swift中它们都是值类型.

  1. 我想弄清楚幕后的原因是什么,因为我的理解是,无论是引用类型还是值类型,对象都存在于Objc和Swift中的堆中.

  2. 是否使编码更容易?即如果它是引用类型,那么指向对象的指针可能不是nil,因此需要检查指针和对象不是nil以访问对象.如果它是值类型,那么只需要检查对象本身?

  3. 但就内存分配而言,值类型和引用类型是一样的,对吧?两者分配相同大小的内存?

谢谢

gna*_*729 18

Objective-C中的数组,字典等通常是可变的.这意味着当我将一个数组传递给另一个方法,然后在另一个方法的后面修改该数组时,会发生令人惊讶的事情(轻轻地说).

通过制作数组,字典等值类型,可以避免这种令人惊讶的行为.当你收到一个Swift阵列时,你知道没有人会在你背后修改它.可以在背后修改的对象是问题的主要来源.

实际上,Swift编译器会尽可能避免不必要的复制.因此即使它表示数组被正式复制,也不意味着它真的被复制了.

  • 我从来没有陷入过这个问题的主要根源.但是,数组的副本有多深?当阵列发生变化时,为什么它是"问题的主要来源",但当该阵列中的某个项目改变了其中一个属性时,却没有"主要问题根源"?为什么他们在Swift团队认为项目的变化不是"问题的主要来源",而改变阵列的长度是很长一段时间的"问题的主要根源",为什么他们改变了他们的意见? (2认同)
  • 对于任何感兴趣的人来说,即使您自己没有遇到过这个问题,他们也解决了这个“没有问题”的原因*可能是*其他人(框架开发人员)已经投入了大量的工作来保护您免受这些错误的影响最有可能发生。这是我在 WWDC15 观看“用 Swift 中的值类型构建更好的应用程序”时得到的印象。 (2认同)

Ric*_*kDT 6

Swift团队在官方开发者论坛上非常活跃.所以,我假设你没有在那里问过,你对社区对变革意味着什么的更广泛的"感觉"更感兴趣,而不是技术实施细节.如果你想完全理解"为什么",那就去问问他们:)

对我来说最有意义的解释是,Objects应该负责对应用程序的状态做出反应并更新它.值应该是您的应用程序的状态.换句话说,数组或字符串或字典(以及其他值类型)永远不应负责响应用户输入或网络输入或错误条件等.对象处理并将结果数据存储到这些值中.

Swift中的一个很酷的功能,它使复杂的值类型(如字典或自定义类型,如Person,而不是简单的Float)更可行,因为值类型可以封装规则和逻辑,因为它们可以具有函数.如果我将值类型写Person为结构,那么Person结构可以具有用于更新由于结婚等原因的函数.这仅仅关注数据,而不是/管理/状态.对象仍将决定更新人名的时间和原因,但是如何安全/可测试地执行此操作的业务逻辑可以包含在值类型本身中.因此,为您提供增加隔离度和降低复杂性的好方法.