Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Swift操作符重载需要是类型方法?

为什么Swift操作符重载需要是类型方法?
EN

Stack Overflow用户
提问于 2021-10-13 06:20:34
回答 3查看 178关注 0票数 1

斯威夫特语言指南显示,如下所示的运算符方法必须编写为static

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Vector2D {
    var x = 0.0, y = 0.0
}

extension Vector2D {
    static func + (left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y + right.y)
    }
}

let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector

如果删除static关键字,它将导致编译错误:

在“Vector2D”扩展中声明的运算符“+”必须是“静态”

提出这一要求的原因是什么?为什么我们不能把它写成一个非静态的方法呢?

我可以盲目地接受“这就是它的方式”。但是我想了解为什么这是必要的,这样我才能更好地理解Swift语言。我一直未能找到提出这项规定的具体原因。

如果我不得不猜测,我猜想Swift中的默认操作符是作为类型方法实现的,因此我们的自定义操作符也必须是静态的。但这纯粹是猜测。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-13 06:55:43

这对我来说很有道理。二进制运算符以两个对象作为参数,并返回结果。

这样的运算符不属于任何对象的实例。它是类中的一个静态方法。对于+类型的Vector2D方法的示例,它是一个知道如何将2个Vector2D对象添加到一起的方法。

您不会在+实例上调用Vector2D方法。您说:“嗨,Vector2D类型,我如何将您的类型的两个实例相加?

您是在“与”类“交谈”,而不是类的实例。

编辑:

如果是实例方法,则必须将add操作符表示为一个操作数的消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extension Vector2D {
    func addVector(_: Vector2D) -> Vector2D {
        // Code to sum two vectors
    }
}

你会把它叫做

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum = aVector.addVector(anotherVector)
票数 1
EN

Stack Overflow用户

发布于 2021-10-13 07:09:41

这是一种语言设计选择,不同的语言决定了不同的对立面: C++不允许静态运算符,而C#要求它们是静态的,就像Swift一样。

对我来说,让操作符静止的最令人信服的理由是对称。

让我们暂时将+替换为名为plus的函数。如果plus是静态的,则将其称为Vector2D.plus(vector, anotherVector),这将与调用Vector2D.plus(anotherVector, vector)相同。

如果它是实例成员,则将其称为vector.plus(anotherVector),这可能与anotherVector.plus(vector)相同,也可能不相同。也就是说,如果vectornil,则vector.plus(anotherVector)肯定是nil,而anotherVector.plus(vector)将等于anotherVector

类似地,操作符+是静态的,允许这个vector + anotherVector == anotherVector + vector,而不考虑两个向量的nil状态。

票数 1
EN

Stack Overflow用户

发布于 2021-10-13 08:41:20

操作人员不必是静态的。它们也可以是全局函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Vector2D {
    var x = 0.0, y = 0.0
}

func + (left: Vector2D, right: Vector2D) -> Vector2D {
    return Vector2D(x: left.x + right.x, y: left.y + right.y)
}

let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector

如果您问为什么它们不能是实例方法,那么,因为实例方法需要一个额外的Vector2D实例来调用。这个实例,加上+需要的两个参数,意味着您需要3个Vector2D来调用+,这没有多大意义.

另一方面,营办商可能是这样设计的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extension Vector2D {
    func +(right: Vector2D) -> Vector2D { ... }
}

其中,二进制运算符不是对两个参数进行操作,而是在self和单个参数上操作。这与Kotlin的操作符重载设计类似。

据我所见,Swift中没有任何东西能阻止Swift被设计成这样。其原因很可能是美学,如邓肯C所建议的“有两个参数更有意义”,而有两个参数也更清楚哪些是左操作数,哪些是右操作数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69557225

复制
相关文章
python 获取环境变量
参考 https://docs.python.org/2/library/os.html
py3study
2020/01/06
8700
如何在单元测试中设置系统环境变量
有时我们需要通过读取系统环境变量来获取一些有用的信息,比如系统路径、临时目录等。在系统真正运行的时候我们可以通过启动命令行,如:java -Dxxx.xxx=xxxx …,或者使用System.setProperty(“xxx.xxx”, “xxx.xxx”)来设置系统环境变量。但在单元测试时如何设置这些系统环境变量又成了一个让人头疼的问题。有些小伙伴是在setUp方法里设置,比如:
Allen Cheng
2018/09/10
8.1K0
iOS开发-获取全部环境变量iOS开发-获取全部环境变量
在Xcode中选中Target然后打开Edit Scheme,当前打开OBJC_PRINT_LOAD_METHODS环境变量。
用户8893176
2021/08/09
1.6K0
iOS开发-获取全部环境变量iOS开发-获取全部环境变量
如何在gin中获取响应体内容?
实现思路: 对gin的responseWriter进行包装, 每次写往请求方写响应数据的时候,将响应数据返回出去。step1: 定义一个新的CustomResponseWriter,通过组合方式持有一个gin.ResponseWriter和response body缓存。type CustomResponseWriter struct { gin.ResponseWriter body *bytes.Buffer}func (w CustomResponseWriter) Write(b []byt
Johns
2021/04/10
11.7K0
如何在gin中获取响应体内容?
如何在Bash中获取数组长度?
在Bash脚本中,数组是一种常用的数据结构,用于存储多个值。在处理数组时,经常需要知道数组的长度,即数组中元素的个数。本文将详细介绍如何在Bash中获取数组长度的方法,以帮助您更好地处理数组操作。
网络技术联盟站
2023/06/17
1.3K0
如何在Bash中获取数组长度?
PHP - 环境变量获取参数
如果fpm是用sudo方式启动,默认sudo会禁用一些环境变量,可以通过以下方式放开限制
断痕
2021/01/21
1.8K0
PHP - 环境变量获取参数
如何在windows下和linux下获取文件(如exe文件)的详细信息和属性
最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息。最后由我用java实现linux上exe文件的版本号读取功能。下面是详细代码:
业余草
2019/01/21
6K0
如何在windows下和linux下获取文件(如exe文件)的详细信息和属性
如何在Java中获取context-param值?
“ context-param”标记在“ web.xml”文件中定义,并且为整个Web应用程序提供参数。
全栈程序员站长
2022/09/13
2.9K0
如何在 React 中获取点击元素的 ID?
在 React 应用中,我们经常需要根据用户的点击事件来执行相应的操作。在某些情况下,我们需要获取用户点击元素的唯一标识符(ID),以便进行进一步的处理。本文将详细介绍如何在 React 中获取点击元素的 ID,并提供示例代码帮助你理解和应用这个功能。
网络技术联盟站
2023/06/07
3.5K0
如何在小程序中获取用户信息
在以前的文章中,我们介绍了小程序的登录鉴权功能,方便开发者去获取用户的appid和session_key以便确认用户的身份。但是,仅仅通过appid和session_key不能去获取用户的信息。那么,这篇文章中,我们将介绍如何在小程序中获取用户的昵称、头像、性别、城市等信息。
it大叔
2019/01/25
6.7K0
如何在小程序中获取用户信息
Jenkins Python Plugin获取环境变量
官方wiki:https://wiki.jenkins-ci.org/display/JENKINS/Python+Plugin
donghui
2019/04/19
2.1K0
Jenkins Python Plugin获取环境变量
教你如何在linux配置环境变量
输入下面命令 cd /etc/ vim profile 在末尾添加环境变量 PATH="$PATH:路径" export PATH 保存退出 重新加载环境变量 source /etc/profile
切图仔
2022/09/08
2.6K0
教你如何在linux配置环境变量
python获取linux环境变量_linux如何设置环境变量
为了演示我的意思,采用两个大致相同的程序(C中的第一个,python中的另一个):
全栈程序员站长
2022/11/10
8.4K0
Request.ServerVariables获取环境变量
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
6800
如何在Power Query中获取数据——表格篇(7)
Table.SelectRowsWithErrors(tableas table,optional columns as nullable list)as table
逍遥之
2020/03/23
2.5K0
如何在小程序中添加广告并获取收益
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xmt1139057136/article/details/89452949
业余草
2019/05/07
5.3K0
如何在小程序中添加广告并获取收益
pandas | 如何在DataFrame中通过索引高效获取数据?
上篇文章当中我们简单介绍了一下DataFrame这个数据结构的一些常见的用法,从整体上大概了解了一下这个数据结构。今天这一篇我们将会深入其中索引相关的应用方法,了解一下DataFrame的索引机制和使用方法。
TechFlow-承志
2020/07/10
13.7K0
pandas | 如何在DataFrame中通过索引高效获取数据?
如何在Power Query中获取数据——表格篇(3)
Table.Last(table as table, optionaldefault as any)as any
逍遥之
2020/03/23
2.5K0
如何在Power Query中获取数据——表格篇(1)
Table.ColumnNames(table as table) as list
逍遥之
2020/03/23
3.2K0
点击加载更多

相似问题

jQuery移动版动态更改按钮颜色

20

更改jquery移动滑块微调按钮的颜色

20

单击jQuery移动设备时更改按钮颜色

10

jquery移动按钮背景颜色

71

jquery移动css。更改颜色

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文