作者:Thomas Hanning胡陪,原文鏈接坷虑,原文日期:2015-12-24
譯者:小袋子秀姐;校對:lfb_CD;定稿:Cee
Swift 可以很方便地創(chuàng)建帶有私有設置方法的公有屬性擂找。這可以讓你的代碼更加安全和簡潔戳吝。
封裝
封裝從根本上意味著類的信息和狀態(tài)應該對外部類隱藏,只有類自身可以操作贯涎。因此听哭,所有的 bug 和 邏輯錯誤更加不可能發(fā)生了。
通常你會使用 setter
以及 getter
來達到封裝的目的柬采。然而欢唾,有時候你根本不想對外提供類中的設置方法。對于這樣的情況粉捻,你可以使用帶有私有設置方法的屬性礁遣。
例子
假設我們想要創(chuàng)建一個代表圓的類,那么圓的半徑應該是可以改變的肩刃。而且祟霍,該圓的面積和直徑應該可以從圓的實例中獲取杏头,而這兩個屬性不應該被類本身以外所更改。出于性能考慮沸呐,面積和直徑也應該只計算一次醇王。
所以這個圓類應該是這樣的:
class Circle {
private var area: Double = 0
private var diameter: Double = 0
var radius: Double {
didSet {
calculateFigures()
}
}
init(radius:Double) {
self.radius = radius
calculateFigures()
}
private func calculateFigures() {
area = M_PI * radius * radius
diameter = 2 * M_PI * radius
}
func getArea() -> Double {
return area
}
func getDiameter() -> Double {
return diameter
}
}
現(xiàn)在所有的需求都滿足啦。然而崭添,Swift 提供了一種更好的方式寓娩,可以使得這段代碼更加簡潔。
帶有私有設置方法的屬性
通過在屬性前面使用 private(set)
呼渣,屬性就被設置為默認訪問等級的 getter
方法棘伴,但是 setter
方法是私有的。所以我們可以去掉兩個 getter
方法:
class Circle {
private(set) var area: Double = 0
private(set) var diameter: Double = 0
var radius: Double {
didSet {
calculateFigures()
}
}
init(radius:Double) {
self.radius = radius
calculateFigures()
}
private func calculateFigures() {
area = M_PI * radius * radius
diameter = 2 * M_PI * radius
}
}
當然也可以為屬性設置公有的 getter
方法:
public class Circle {
public private(set) var area: Double = 0
public private(set) var diameter: Double = 0
public var radius: Double {
didSet {
calculateFigures()
}
}
public init(radius:Double) {
self.radius = radius
calculateFigures()
}
private func calculateFigures() {
area = M_PI * radius * radius
diameter = 2 * M_PI * radius
}
}
對象
在這個例子中屁置,屬性只是 Double
值焊夸。然而,如果是一個對象蓝角,可以通過使用對象的某個方法來操作阱穗!使用私有設置方法只允許設置一個全新的對象,在使用過程中應銘記這一點使鹅。
本文由 SwiftGG 翻譯組翻譯揪阶,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg并徘。