gpt4 book ai didi

Swift 中类似 Python 的运算符重载

转载 作者:行者123 更新时间:2023-11-30 10:19:09 26 4
gpt4 key购买 nike

我正在开始使用 Swift。我之前的编程背景主要是Python,所以我倾向于在S​​wift中寻找Python式的编码方式,幸运的是它部分受到Python的启发。在 Python 中,有一种非常强大的方法可以使用特殊方法来重载类中的运算符。我知道我们可以通过在某个 namespace 中定义一个函数来重载 Swift 中的运算符,我们希望在其中实现特殊行为,但我还没有找到一种按类重载运算符的方法。

编辑 - 添加示例。

class Vector(object):
def __init__(self, *args): # Initializing a vector of random size
self.vector = tuple(args)

def __len__(self): # This sources the data to the built-in len() function
return len(self.vector)

def __getitem__(self, i): # Overloads [ ] operator
return self.vector[i]

def __add__(self, vector): # Overloads + operator
if len(self) != len(vector):
raise ValueError("Vectors should be of equal length")
return tuple([self.vector[i] + vector[i] for i in xrange(len(self))])


a, b = Vector(1, 2, 3, 4), Vector(2, 3, 4, 5) # My modified tuples

print(a + b) # this operation is affected
print((1, 2, 3, 4) + (2, 3, 4, 5)) # this is not, since these are standard tuples

输出:

(3, 5, 7, 9) 
(1, 2, 3, 4, 2, 3, 4, 5)

这里我刚刚通过定义 add 方法重载了 +,并通过定义 getitem 方法重载了 []。该类可以从 Python 中的元组类型以及初始化器继承 [] 行为,但我手动完成了这一切以提供更多细节。由于重载被封装在类中,因此它不会影响一般运算符的行为,因为所有类型和类都定义了自己的特殊方法。

最佳答案

使用不同机制覆盖几个不同的运算符。等价于 __getitem__ 是覆盖 subscript 要覆盖 plus,您需要在全局空间中实现 func +,最终得到:

class Vector<T> {
let vector : [T]

init(values:[T]) {
vector = values
}

subscript(index:Int) -> T {
get {
return vector[index]
}
}

func len() -> Int {
return vector.count
}
}

protocol Addable {
func +(lhs:Self, rhs:Self) -> Self
}

func + <T:Addable>(left:Vector<T>, right:Vector<T>) -> Vector<T> {
var result = [T]()

assert(left.len() == right.len(), "vectors should be of equal length")
for i in 0 ..< left.len() {
result.append( left[i] + right[i] )
}

return Vector(values: result)
}

请注意,我已将其实现为通用的,因此分散在各处。您还需要表明您使用的任何数据类型都实现了 Addable 协议(protocol)。就这么简单:

extension Int : Addable {}

我还可能指出,对于您的 Vector 类来说,通过标准数组类和重写运算符无法获得真正的好处,如下所示:

func + <T:Addable>(left:Array<T>, right:Array<T>) -> Array<T> {
var result = [T]()

assert(left.len() == right.len(), "vectors should be of equal length")
for i in 0 ..< left.len() {
result.append( left[i] + right[i] )
}

return result
}

无论哪种情况,您都可以使用内联 + 运算符轻松地对数组或向量执行向量数学运算。

关于Swift 中类似 Python 的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com