如何重载 swift 中的运算符?
How do you overload an operator in swift?
假设你有一个 class C。它有两个实例变量,number 和 vector。 vector 只是一个整数或双精度数组。
我想做以下事情:
c1 = C()
c1.number = 2
c1.vector = [1,2,3]
c2 = C()
c2.number = 3
c2.vector = [4,6,7]
println(c1.number + c2.number) \print to screen 5
println(c1.vector + c2.vector) \ print [5,8,10]
基本上,我希望重载“+”运算符,以便它知道根据类型使用“+”中的哪个 "version"。
已为 Array 类型定义了 + 运算符。它执行数组合并并将右值的值附加到左值上。要按索引对值求和,您可以这样做:
protocol Numeric { }
extension Double: Numeric {}
extension Int: Numeric {}
func +<T: Numeric>(left: [T], right: [T]) -> [T]? {
var numElements: Int = 0
if count(left) != count(right) {
return nil
} else {
numElements = count(left)
}
var result = [T]()
for var i = 0; i < numElements; ++i {
if let lvalue = left[i] as? Int, rvalue = right[i] as? Int {
result.append(lvalue + rvalue as! T)
} else if let lvalue = left[i] as? Double, rvalue = right[i] as? Double {
result.append(lvalue + rvalue as! T)
}
}
return result
}
但一般来说,我不建议覆盖预定义的运算符,因为很可能在以后造成混乱和混乱。
假设你有一个 class C。它有两个实例变量,number 和 vector。 vector 只是一个整数或双精度数组。
我想做以下事情:
c1 = C()
c1.number = 2
c1.vector = [1,2,3]
c2 = C()
c2.number = 3
c2.vector = [4,6,7]
println(c1.number + c2.number) \print to screen 5
println(c1.vector + c2.vector) \ print [5,8,10]
基本上,我希望重载“+”运算符,以便它知道根据类型使用“+”中的哪个 "version"。
已为 Array 类型定义了 + 运算符。它执行数组合并并将右值的值附加到左值上。要按索引对值求和,您可以这样做:
protocol Numeric { }
extension Double: Numeric {}
extension Int: Numeric {}
func +<T: Numeric>(left: [T], right: [T]) -> [T]? {
var numElements: Int = 0
if count(left) != count(right) {
return nil
} else {
numElements = count(left)
}
var result = [T]()
for var i = 0; i < numElements; ++i {
if let lvalue = left[i] as? Int, rvalue = right[i] as? Int {
result.append(lvalue + rvalue as! T)
} else if let lvalue = left[i] as? Double, rvalue = right[i] as? Double {
result.append(lvalue + rvalue as! T)
}
}
return result
}
但一般来说,我不建议覆盖预定义的运算符,因为很可能在以后造成混乱和混乱。