为啥 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter?

Posted

技术标签:

【中文标题】为啥 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter?【英文标题】:Why doesn't Swift use getter and setter for properties as much as Java or C#?为什么 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter? 【发布时间】:2020-08-02 07:47:45 【问题描述】:

Q1:我有 Java/C# 背景,现在正在学习 Swift。当我编写 java 或 C# 代码时,对于类中的每个属性,我都需要编写 getter 和 setter。但是,我发现我们并没有在 swift 中写这么多的 getter 和 setter。我很好奇为什么会这样。

Q2:我知道有两种属性,存储属性和计算属性。似乎我们只需要为计算属性设置 getter 或 setter。真的吗?

【问题讨论】:

确保标题匹配问题。这将避免许多反动的反对票。实际问题和标题目前没有有用的关系。此外,包括实际错误指示符,包括错误消息或支持性输出。 我从 Java 的角度写了一篇关于这个问题的文章:github.com/amomchilov/Blog/blob/master/… 【参考方案1】:

Java 在历史上对直接属性访问和获取值的方法调用(“getter”)有不同的语法。由于您可能有一天希望使用方法覆盖属性,因此为了保持一致性,通常在所有情况下都创建方法。

Swift 通过对直接属性访问和“getter”(计算属性)使用相同的语法来避免这个问题。这意味着您可以稍后改变主意而不会影响调用者,因此没有理由创建“以防万一”的方法。

计算属性在 Swift 中定义为带有“getter”(get 方法)的属性。

【讨论】:

句法相似性是不够的,存储属性和计算机属性都必须具有相同的 ABI 也很重要,这样调用者就不必更改。幸运的是,Swift 做到了(尽管我认为有一些内部属性允许直接访问,IDR) @Alexander-ReinstateMonica 在 Swift 或 Java 的历史中是否存在语法相似性不足的情况?在 ABI 稳定之前,您必须将所有内容构建在一起,所以这无关紧要。由于 ABI 的稳定性,“幸运的是,Swift 做到了”,所以没关系。是否存在这种区别对手头的问题很重要的情况(虽然确实如此?) 我把它扔进去只是为了说明java中的“问题”不仅仅是方法和属性之间的不同语法问题。如果 Java 假设添加了一个静态重写以将 target.field 转换为 target.getField(),但仍然允许直接 ivar 访问,那么他们仍然存在需要通过这种防御性、显式 ivar 隐藏和 getter/setter 编写来解决的问题。

以上是关于为啥 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不像 'IsPostBack' 那样实现 'IsRefresh'、'IsBackPost' 呢?

为啥 glm::vec3 不像浮动数组那样排序[关闭]

为啥指向成员函数的指针不像数据指针那样只是内存地址

为啥 flexbox 不像 div 中的其他元素那样居中我的图像?

为啥代客共享不像本地代客那样在请求中添加斜线

在 scala 中创建的图像看起来不像预期的那样。不知道为啥