3

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

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

let t = (1, 2)
-t

我得到一个错误:找不到接受提供的参数的“-”的重载。这是预期的行为吗?

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

4

2 回答 2

1

我一直在玩这个,对我来说它看起来像是一个错误。您的函数中的代码没有任何问题,它应该作为前缀工作。您可以在此处提交错误报告。您也可以尝试在 Apple Developer 论坛中发布此内容,您可能会得到官方来源的回复。

于 2014-07-06T14:42:26.527 回答
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 元素元组。

于 2014-07-06T22:03:28.550 回答