Swift中的自定义运算符功能:矩阵加法

作为一名新程序员,我遇到了许多用于处理信息的新逻辑结构和工具。 但是,我每天至少使用一件事,这似乎需要零新学习:标准数学运算符+,-,*,/。 胜利! 加,减,乘,除…这些符号的工作方式与我在小学时进行简单算术问题时所用的方式相同。

好吧,不是那么快。 一会儿再思考:操作员到底什么? 当操作数是相同类型时,运算符将在后台执行某些操作以返回结果。 为了简化和总结正在发生的事情,运算符是行为类似于函数但在语法上有所不同的构造。 确实,语法是我们在日常生活中遇到的语法,因此很容易忽略使这些运算符在编程上下文中工作的底层代码。

一旦将运算符视为函数,就自然会问:在另一个环境中,我如何能够实现这种类型的功能? 关于Swift编程语言的一件很酷的事情是,它很容易允许您为自定义和非数字操作数创建运算符函数。 由于我是一个数学迷,因此我选择矩阵作​​为探索如何编写自定义加法运算符的起点。 首先,我必须创建一个Matrix结构。

该结构具有三个存储的属性:矩阵中的行数,矩阵中的元素总数以及在给定这些参数的情况下生成的矩阵本身。 有两个计算的属性:矩阵中的列数和矩阵的字符串描述。 关于后者,我选择覆盖Matrix结构的默认print()输出,以呈现彼此堆叠而不是在超级数组中水平列出的行。 毕竟,这是我大学教科书中矩阵的外观! 刚刚了解了协议,这是我第一次使用该概念。 实现计算的描述属性是CustomStringConvertible协议的一项要求。 接下来,初始化器:

关于此初始值设定程序,最值得注意和有趣的事情可能是它返回了一个可选值。 必须且仅当元素可以在行之间平均分配以创建完美的“矩形”超数组时,才能确保初始化Matrix结构。 (向我的出色同学Cenker喊话,帮助我解决了嵌套循环!)现在,为Matrix结构体创建新版本“ +”的有趣部分是:

同样,与初始值设定项一样,“ +”函数返回可选的Matrix,因为仅当操作数矩阵具有相同维时才可以执行矩阵加法。 我在编写此函数时遇到了一些挑战。 首先,我最初解决该问题的方法是遍历Matrix结构本身。 我根据矩阵属性的[[Int]]类型错误地考虑了matrixA和matrixB。 但是,当我尝试编写对行和列进行迭代的嵌套for循环时,Xcode引发了错误:

我的错误很快变得很清楚。 for-in迭代功能不适用于我的自定义Matrix结构。 我做了一些阅读,发现Matrix必须符合SequenceType协议才能利用for-in循环。 我回头看了我的Matrix结构的内部工作原理,而不是实现该协议所需的功能,该功能将依赖于另一个符合不同生成器协议的自定义结构。 Matrix的哪些属性已经符合SequenceType? 为了实现我的目标,我该如何操纵这些属性而不是Matrix结构本身? 这就是我得出的对矩阵A和matrixB的元素[Int]属性进行迭代以计算总和的方法。

有用! 这是我做过的测试:

显然,要为矩阵数学创建一个全面的模型,还有许多工作要做。 最终,遵循SequenceType协议以利用直接迭代功能将是更理想的选择。 但是,瞧! 已经有开放源代码可以执行此操作:

矩阵结构参考
该集合还使用Apple的 mauriciosantos.github.io 提供了线性代数函数和运算符,例如inverse(),+和*。

尽管如此,解决这些问题有助于我更好地掌握操作员的能力和潜力,并加深了我对更高级的Swift编程约定(如结构和协议)的理解。