【问题标题】:Can't define an unary operator for a tuple无法为元组定义一元运算符
【发布时间】:2014-07-06 13:28:53
【问题描述】:

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

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

let t = (1, 2)
-t

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

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

【问题讨论】:

  • 这对我来说甚至在 Swift 4.2 中都不起作用。我无法为包含 4 个项目的元组创建前缀一元运算符“-”。你能找到解决方法吗?

标签: operators swift unary-operator


【解决方案1】:

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

【讨论】:

  • 是的,我已经提交了一些 Swift 错误报告,这似乎是另一个不错的候选者,只是想澄清一下。我也在开发者论坛上发了一个话题,可能要等几天才能收到回复。
  • 编译器如何区分为 Int 的元组定义一元运算符和为 Int 定义二元运算符?
  • 好吧,为什么不呢?语法不同。您也可以使用类型别名:typealias IntPair = (Int, Int),但它仍然无法按预期工作。
  • @Nicky:有什么不同?
  • @newacct:对于一对 Int,它将是 @infix func - (lhs: Int, rhs: Int) -> ...。也许我错过了你的观点?
【解决方案2】:

这是一个快速的解决方法:

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

【讨论】:

  • 这很酷,尽管我个人会避免使用未记录的内部结构。我希望他们以一种或另一种方式公开它。
  • @Nicky 在我看来,目前很多东西都没有记录在案,显然在未来的某个时候会记录在案。除非版本 1 中没有记录,否则我不会担心它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多