2014-06-06 35 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 
然而