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之后的访问修饰符的,希望对大家有所帮助
请发表评论