1

我试图在 Swift 中为双打重载 % 运算符。我意识到存在 Double 类型的两种方法的原因,但是truncatingRemainder()' 的行为对我的用例来说效果很好。

我正在使用 Xcode Playgrounds 来解决这个问题,我以为我已经解决了。

infix operator %

func % (left: Double, right: Double) -> Double {
    return left.truncatingRemainder(dividingBy: right)
}

var x = 0.0

for _ in 0...5 {
    print(x)
    x = (x + 1.5) % 5.0
}

print(x)

这工作正常,并给了我正确的预期行为。

在此之后,我尝试将其放入我正在研究的库中。我创建了一个新的 .swift 文件,重建了库,确保导入语句在我的 Playground 中正常工作(通过使用库中的其他函数/方法),但出现以下错误:

  • 为运算符找到不明确的运算符声明
  • 无法将“()”类型的值转换为预期的参数类型“Double”
  • 运算符不是已知的二元运算符

Xcode 屏幕截图显示了上面列出的代码旁边列出的错误。

谁能解释将其放入我的 Playground 和将其包含在导入文件中的区别?

4

1 回答 1

1

对于库,您只需要声明具有公共访问权限的函数。没必要infix operator %。您正在执行运算符重载。

public func % (left: Double, right: Double) -> Double {
    return left.truncatingRemainder(dividingBy: right)
}

infix operator在使用自定义运算符时需要。喜欢infix operator **

于 2021-06-23T18:29:11.360 回答