讓 property 變成唯讀的 private(set)
Swift 的 access control 語法讓我們可以透過 open, public,internal,private & fileprivate 設定東西的存取權限,將權限加在型別,property & method 等東西身上,幫助我們開發更安全的程式。
我們都知道女人的年齡是天大的秘密,因此底下就讓我們以 Woman 的 age 為例。我們在 var age 前加上權限 private,因此之後我們只能從 function intro 得知她的年紀,無法從 class Woman { } 外的程式存取 age。
class Woman { var name = "penny" private var age = 18 func intro() { print("我的名字是\(name),我的年齡是\(age)") }}var cuteWoman = Woman()cuteWoman.intro()
由於 private 的關係,age 變成不能從 class Woman { } 外讀取和修改。然而有時我們希望它變成唯讀,想要它不能修改但可以讀取,這有方法辦到嗎 ?
當然可以 !
Swift 裡有讀取東西的 getter & 修改東西的 setter。當我們透過 . 讀取 property 時是透過 getter,透過 . 修改 property 時則透過 setter,而剛剛的 private var age
將讓 age 的 getter 和 setter 都變成 private,因此不能讀取也不能修改。但我們其實可另外透過 (set) 指定 setter 的權限,讓 setter 和 getter 擁有不同的權限,比方以下例子:
class Woman { var name = "penny" private(set) var age = 18 func getOlder() { age = age + 1 }}var cuteWoman = Woman()print(cuteWoman.age)cuteWoman.getOlder()
private(set) var age
表示 age 的 setter 權限為 private,但 getter 權限維持預設的 internal,因此我們可從 class Woman { } 外讀取 age,也能呼叫 function getOlder 增加 age,但想直接以 cuteWoman.age = 2
修改 age 卻是萬萬不可!
在設定 setter 權限時,還有以下幾個要注意的小地方:
1. setter 的權限不能比 getter 高。
就像彼得潘的女朋友 Wendy 不能比 Peter 高,setter 的權限也不能比 getter 高。因此像 getter 是 internal,setter 是 public 將產生錯誤。
2. 可同時指定 getter & setter 的權限。
比方以下例子,age 的 getter 是 public,setter 是 private。當同時指定 getter & setter 的權限時,只有 setter 要注明 (set),getter 不須加上 (get)。
public class Woman { var name = "penny" public private(set) var age = 18 func getOlder() { age = age + 1 }}