Swift中訪問修飾符總共有5種,分別為fileprivate,private,internal,public和open,其中,fileprivate以及open是Swift 3新新增的.因為過去的Swift對於訪問許可權的控制,不是基於類的,而是基於檔案的,這樣會有問題,所以在Swift 3中增加了兩個對原本的private,public進行細分.
1.private與fileprivate
fileprivate是在Swift 3之後新增的,將原本的private進行細分
在引入Swift 3之前,private關鍵字將實體的使用限制在定義它的原始檔中.如下:
import UIKit class NotesViewController: UIViewController { private var dataSource = [String]() } extension NotesViewController: UITableViewDataSource { func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataSource.count } ... }
我們宣告一個UIViewController子類NoteViewController,子類並帶有私有屬性dataSource.在同個原始檔中,我們為NotesViewController類建立一個擴充套件,遵守UITableViewDataSource協議,也可訪問到私有屬性private修飾的.
上面的程式碼是Swift3之前,如果將上述程式碼移植到Swift 3,編譯器會報錯,會提示dataSource屬性是一個未解析的識別符號.換句話說,dataSource屬性宣告為private,副檔名中是不可以訪問的.
Swift 3以後,private為私有的實體只能在宣告的範圍內被訪問.而fileprivate可以在擴充檔案中訪問.
import UIKit class NotesViewController: UIViewController { fileprivate var dataSource = [String]() } extension NotesViewController: UITableViewDataSource { func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataSource.count } ... }
2.internal修飾符
internal訪問許可權在模組內部可以訪問到,超出模組內部就不可被訪問了,Swift中預設就是internal的訪問許可權.
3.public與open
Swift 3之前 public可以用來修飾class或者class成員方法,成員屬性等.Swift 3新增了open訪問控制關鍵字.
修飾class的public和open區別:
public修飾的class允許外部模組呼叫,但是不允許繼承,而open修飾的class即允許其他模組呼叫,也允許被子類繼承
修復class成員的public和open區別:
public修飾的成員允許其他模組呼叫,但不能被覆蓋(override),而open修飾的成員既允許被其他模組呼叫,也可以被子類覆蓋
open使用注意:
1.如果class宣告為public,那麼class的成員變數就不可以宣告為open,因為public class已被限定為不可繼承
public class NonSubclassableParentClass { public func foo() {} //非法宣告 open func bar() {} public final func baz() {} }
2.其他模組繼承父類的成員時,也需要把成員宣告為open
open class SubclassableParentClass { public func foo() {} open func bar() {} public final func baz() {} } open class SubclassC : SubclassableParentClass { //非法,成員沒有被宣告為open override func bar() { } }
以上就是Swift 3之後的訪問修飾符的,希望對大家有所幫助