鉴于以下功能:错误:“诠释”是无法转换为“@lvalue浮动”
func greatestCommonDenominator(first: Int, second: Int) -> Int {
return second == 0 ? first : greatestCommonDenominator(second, first % second)
}
而且在它下面的东西一个结构:
struct Fraction {
var numerator: Int
var denominator: Int
func reduce() {
let gcd = greatestCommonDenominator(numerator,denominator)
self.numerator /= gcd
self.denominator /= gcd
}
// stuff
}
我越来越以下错误:
error: 'Int' is not convertible to '@lvalue Float'
self.numerator /= gcd
^
error: 'Int' is not convertible to '@lvalue Float'
self.denominator /= gcd
^
'@lvalue Float'
?!?!?什么?我在这里的任何地方都没有Float。并且文档似乎暗示/=
应返回Int
,因为我将两个Int
s分开。我该如何解决?
附录:我碰到这个问题一个结构中工作,但是这个问题似乎重现的任何地方。
let a = 10
a /= 5
这会产生同样的问题。即使我们明确地键入a
作为Int
:
let a: Int = 10
a /= 5
同样的问题依然存在。 Swift似乎认为两个Ints之间的/=
运算符的结果是一个Float。
编辑:与增编的问题实际上并没有那么a /= 5
不起作用。它确实!
var a: Int = 4
var b: Int = 3
a /= b
现在a
是3增编的问题是相似的结构。在附录中,a
被宣布为let
而不是var
,因此它是不可分配的。
注意那里的三元运算符 - 两个可选的数据类型被转换为相同的类型。我记得那些运营商导致不寻常的错误的一些codepuzzlers。我觉得你应该在这里摆脱它,并用更长的声明替换它。 – Johannes
我很困惑你的评论。我在这里使用三元运算符时是否存在特定的问题,或者您是否总体上对它提出警告? – nhgrif
我一般都很警惕,如果这里有问题,我无知。我认为第一个和最好的CommonDenominator的数据类型是不同的。可能会有一些幕后的演员正在进行编译,但打破了内联功能。在测试中困难的地方可能是一个问题。这不是你的代码中的问题,但我已经对它做了评论。代码中的问题与'/ ='有关......如果你把它写成= =(int)(a/b),它可能会消失。 – Johannes