2015-12-21 302 views
1

鑑於這種結構:直角三角形實施

struct RightTriangle { 

var length: Double 
var width: Double 

var hypotenuse : Double { 
    get { 
     return sqrt((self.length * self.length) + (self.width * self.width)) 
    } 
    } 
} 

我可以輕鬆地創建它的一個實例:

var rightTriangleOne = RightTriangle(length: 3.0, width: 4.0) 

,並獲得斜邊值:

rightTriangleOne.hypotenuse //returns 5.0 

現在,這裏的問題

如果我想設置如何將斜邊設置爲特定值,並讓寬度和長度值反映這些變化?

我們可以創建基於新的斜邊值,我們重新分配的寬度或長度(在這種情況下寬度)二傳手:

set { 
     self.width = sqrt((newValue * newValue) - (length * length)) 
} 

現在,如果我們檢查了我們的價值觀:

rightTriangleOne.width // 4.0 
rightTriangleOne.length // 3.0 
rightTriangleOne.hypotenuse // 5.0 

一切都很好,但現在讓我們嘗試將斜邊設置爲一個新值:

rightTriangleOne.hypotenuse = 10.0 

很酷, š現在檢查我們的長度和寬度(寬度應修改本身,讓斜邊爲10,但長度不亂):

rightTriangleOne.width // 9.539392014169456 
rightTriangleOne.length // 3.0 

這是偉大的,所有的,但有一個問題。問題在於,如果我們將長度或寬度設置爲除當前值以外的其他任何值,那麼斜邊會發生改變,而我不希望這樣做。

例如

如果我設置斜邊10,並且寬度爲4,長度應該設置爲9.16左右。

此實現是否可行?我試圖嚴格執行計算屬性。

在此先感謝。在widthlength

+0

我不知道swift,但總的來說,你需要一個斜邊長度不變的專用類型,或者一個專門的例程,它可以在保持ac的同時改變長度或寬度即時斜邊長度。 – phoog

+0

是的,我在想同樣的事情。我有一位同事向我提出了這個建議,而且我只是通過計算屬性來解決這個問題。寄予厚望,我會繼續發佈問題。感謝您的幫助@phoog –

+0

因此,如果您設置了任何兩個屬性,第三個屬性會自動計算? – vacawama

回答

0

使用自定義setter方法:

struct RightTriangle: CustomStringConvertible { 
    private var _length: Double 
    private var _width: Double 

    var length: Double { 
     get { 
      return _length 
     } 
     set { 
      let h = self.hypotenuse 
      _length = newValue 
      _width = sqrt(h * h - _length * _length) 
     } 
    } 

    var width: Double { 
     get { 
      return _width 
     } 
     set { 
      let h = self.hypotenuse 
      _width = newValue 
      _length = sqrt(h * h - _width * _width) 
     } 

    } 

    var hypotenuse: Double { 
     get { 
      return sqrt(length * length + width * width) 
     } 
     set { 
      _width = sqrt((newValue * newValue) - (length * length)) 
     } 
    } 

    init(length: Double, width: Double) { 
     _length = length 
     _width = width 
    } 

    var description: String { 
     return "length = \(length), width = \(width), hypotenuse = \(hypotenuse)" 
    } 
} 

var x = RightTriangle(length: 3, width: 4) 
x.hypotenuse = 10 
x.width = 4 

print(x) // length = 9.1651, width = 4.0, hypotenuse = 10.0 

實例變量_length_width什麼實際存儲的三角形的尺寸。他們相應的屬性有自定義setter來協調變化到另一邊。

這種帶有2個假設:

  • 如果更改hypotenuse,這是width將被改變,以匹配
  • 它有一個不可能三角尺寸沒有錯誤檢查,如陰性,或length = 10, hypotenuse = 5然後width = nan
+0

體面的想法,但你不需要單獨的私有存儲屬性 - 只需使用'willSet'或'didSet'。 – rickster