有谁知道为什么最后一行输出-4.0而不是4.0?
extension Double {
var absoluteValue: Double {
if self > 0.0 {
return self
}
else {
return -1 * self
}
}
}
var minusTwo = -2.0
minusTwo.absoluteValue // 2.0
let minusThree = -3.0
minusThree.absoluteValue // 3.0
-4.0.absoluteValue // -4.0
答案 0 :(得分:10)
它只是被解析为-(4.0.absoluteValue)
。这有效:
> (-4.0).absoluteValue
$R2: Double = 4
答案 1 :(得分:3)
原因是因为你错过了表达式的微妙运算符优先级。
在你的表达中:
-4.0.absoluteValue
有两个运算符, - (一元减号运算符,前缀)和。 (方法操作员)。它似乎是优先权。已经不堪重负 - ,表达式被解析为:
-(4.0.absoluteValue)
因此,你得到4.0的绝对值的结果,然后用一元减号运算符翻转它,得到-4.0。
通过更深入地了解Swift头文件,我注意到了。 (方法运算符)不在运算符列表中。这意味着 。是一个语言依赖的更基础的运算符,不能像其他普通运算符一样重载。
我在假设。具有比其他任何东西更高的优先级,包括+ - * / =,从而导致你的混乱。
不过,这是我的解决方案。我将absoluteValue作为一种方法,因为它比使它成为属性更有意义。extension Double {
func absoluteValue() -> Double {
if self < 0 {
return -self
} else {
return self
}
}
}
let myDouble: Double = -7.65
println("The absolute value of \(myDouble) is \(myDouble.absoluteValue()).")
答案 2 :(得分:3)
使用Swift 4.0.2进行测试:
extension Double {
var absoluteValue: Double {
return abs(self)
}
}
var x = -75.34
print(x.absoluteValue) // Prints 75.34
print((-31.337).absoluteValue) // Prints 31.337
答案 3 :(得分:0)
这是我的解决方案:
extension Double{
// Abs property
var absoluteValue: Double{
return Double.abs(self)
}
// Abs method
func absValFunc() ->Double{
return Double.abs(self)
} }
var doubleValue = -36.00
doubleValue.absoluteValue
doubleValue.absValFunc()