Jus*_*tin 18 objective-c value-type reference-type swift
在Objc字符串中,数组和字典都是引用类型,而在Swift中它们都是值类型.
我想弄清楚幕后的原因是什么,因为我的理解是,无论是引用类型还是值类型,对象都存在于Objc和Swift中的堆中.
是否使编码更容易?即如果它是引用类型,那么指向对象的指针可能不是nil,因此需要检查指针和对象不是nil以访问对象.如果它是值类型,那么只需要检查对象本身?
但就内存分配而言,值类型和引用类型是一样的,对吧?两者分配相同大小的内存?
谢谢
gna*_*729 18
Objective-C中的数组,字典等通常是可变的.这意味着当我将一个数组传递给另一个方法,然后在另一个方法的后面修改该数组时,会发生令人惊讶的事情(轻轻地说).
通过制作数组,字典等值类型,可以避免这种令人惊讶的行为.当你收到一个Swift阵列时,你知道没有人会在你背后修改它.可以在背后修改的对象是问题的主要来源.
实际上,Swift编译器会尽可能避免不必要的复制.因此即使它表示数组被正式复制,也不意味着它真的被复制了.
Swift团队在官方开发者论坛上非常活跃.所以,我假设你没有在那里问过,你对社区对变革意味着什么的更广泛的"感觉"更感兴趣,而不是技术实施细节.如果你想完全理解"为什么",那就去问问他们:)
对我来说最有意义的解释是,Objects应该负责对应用程序的状态做出反应并更新它.值应该是您的应用程序的状态.换句话说,数组或字符串或字典(以及其他值类型)永远不应负责响应用户输入或网络输入或错误条件等.对象处理并将结果数据存储到这些值中.
Swift中的一个很酷的功能,它使复杂的值类型(如字典或自定义类型,如Person,而不是简单的Float)更可行,因为值类型可以封装规则和逻辑,因为它们可以具有函数.如果我将值类型写Person
为结构,那么Person结构可以具有用于更新由于结婚等原因的函数.这仅仅关注数据,而不是/管理/状态.对象仍将决定更新人名的时间和原因,但是如何安全/可测试地执行此操作的业务逻辑可以包含在值类型本身中.因此,为您提供增加隔离度和降低复杂性的好方法.
归档时间: |
|
查看次数: |
4225 次 |
最近记录: |