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之后的訪問修飾符的,希望對大家有所幫助