看来您无法为元组定义一元运算符。考虑这个例子:
@prefix func - (tuple: (Int, Int)) -> (Int, Int) {
return (-tuple.0, -tuple.1)
}
let t = (1, 2)
-t
我收到一个错误:无法找到接受提供的参数的' - '的重载。这是预期的行为吗?
值得注意的是二元运算符工作正常,例如您可以为元组定义==
,它可以按预期工作。
答案 0 :(得分:1)
我一直在玩这个,对我来说这看起来像个错误。您的函数中的代码没有任何问题,它应该作为前缀。您可以提交错误报告here。您也可以尝试在Apple Developer论坛上发布此消息,您可能会收到官方消息来源的回复。
答案 1 :(得分:0)
以下是一个快速解决方法:
/// 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元素元组。