讓 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()
因為 age 是 private,所以不能存取

由於 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 卻是萬萬不可!

別想修改 age,因為它的 setter 是 private

在設定 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   }}

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com