看来您不能为元组定义一元运算符。考虑这个例子:
@prefix func - (tuple: (Int, Int)) -> (Int, Int) {
return (-tuple.0, -tuple.1)
}
let t = (1, 2)
-t
我得到一个错误:找不到接受提供的参数的“-”的重载。这是预期的行为吗?
值得注意的是,二元运算符工作正常,例如,您可以==
为元组定义它并按预期工作。
看来您不能为元组定义一元运算符。考虑这个例子:
@prefix func - (tuple: (Int, Int)) -> (Int, Int) {
return (-tuple.0, -tuple.1)
}
let t = (1, 2)
-t
我得到一个错误:找不到接受提供的参数的“-”的重载。这是预期的行为吗?
值得注意的是,二元运算符工作正常,例如,您可以==
为元组定义它并按预期工作。
我一直在玩这个,对我来说它看起来像是一个错误。您的函数中的代码没有任何问题,它应该作为前缀工作。您可以在此处提交错误报告。您也可以尝试在 Apple Developer 论坛中发布此内容,您可能会得到官方来源的回复。
这是一个快速的解决方法:
/// Should've called "Double"
/// but it is already taken for double-precision number
struct Duple<L,R> {
let l:L
let r:R
init(_ l:L, _ r:R) {
self.l = l
self.r = r
}
@conversion func __conversion()->(L,R) {
return (l, r)
}
}
@prefix func -<L:SignedNumber, R:SignedNumber>
(d:Duple<L,R>)->Duple<L,R> {
return Duple(-d.l, -d.r)
}
let pair = Duple(4, -2)
let (left, right) = -pair
println("\(left,right)")
用泛型编写,因此它不仅适用于 (Int, Int),而且适用于任何符合 SignedNumber 协议的 2 元素元组。