无法为元组定义一元运算符

时间:2014-07-06 13:28:54

标签: operators swift unary-operator

看来您无法为元组定义一元运算符。考虑这个例子:

@prefix func - (tuple: (Int, Int)) -> (Int, Int) {
    return (-tuple.0, -tuple.1)
}

let t = (1, 2)
-t

我收到一个错误:无法找到接受提供的参数的' - '的重载。这是预期的行为吗?

值得注意的是二元运算符工作正常,例如您可以为元组定义==,它可以按预期工作。

2 个答案:

答案 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元素元组。