2014-06-06 33 views
4

有谁知道为什么最后一行输出-4.0而不是4.0?为Double类型添加一个扩展,用于添加absoluteValue属性

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

(-4.0).absoluteValue // 4.0 –

回答

9

它只是被解析为-(4.0.absoluteValue)。这工作原理:

> (-4.0).absoluteValue 
$R2: Double = 4 
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()).") 
+1

一个建议:现在的问题是要求添加一个属性,而不是方法。 尝试: 'VAR absoluteValue:双{ 如果(自<0){ 回归自我* -1 } 回归自我 } ' –

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() 
+0

你能解释一下你的代码?特别是,请解释**它如何回答“*有人知道为什么最后一行输出-4.0而不是4.0?*”。 –

1

与斯威夫特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 634.433 
然而