Swift的访问控制讲解
2020-12-13 04:36
标签:访问控制 str open 私有 color extension ble turn UNC 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关键字将实体的使用限制在定义它的源文件中.如下: 我们声明一个UIViewController子类NoteViewController,子类并带有私有属性dataSource.在同个源文件中,我们为NotesViewController类创建一个扩展,遵守UITableViewDataSource协议,也可访问到私有属性private修饰的. 上面的代码是Swift3之前,如果将上述代码移植到Swift 3,编译器会报错,会提示dataSource属性是一个未解析的标识符.换句话说,dataSource属性声明为private,扩展名中是不可以访问的. Swift 3以后,private为私有的实体只能在声明的范围内被访问.而fileprivate可以在拓展文件中访问. 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使用注意: 2.其他模块继承父类的成员时,也需要把成员声明为open 以上就是Swift 3之后的访问修饰符的,希望对大家有所帮助 Swift的访问控制讲解 标签:访问控制 str open 私有 color extension ble turn UNC 原文地址:https://www.cnblogs.com/guohai-stronger/p/11114722.htmlimport UIKit
class NotesViewController: UIViewController {
private var dataSource = [String]()
}
extension NotesViewController: UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
...
}
import UIKit
class NotesViewController: UIViewController {
fileprivate var dataSource = [String]()
}
extension NotesViewController: UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
...
}
1.如果class声明为public,那么class的成员变量就不可以声明为open,因为public class已被限定为不可继承public class NonSubclassableParentClass {
public func foo() {}
//非法声明
open func bar() {}
public final func baz() {}
}
open class SubclassableParentClass {
public func foo() {}
open func bar() {}
public final func baz() {}
}
open class SubclassC : SubclassableParentClass {
//非法,成员没有被声明为open
override func bar() { }
}