Swift的访问控制讲解

Posted guohai-stronger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift的访问控制讲解相关的知识,希望对你有一定的参考价值。

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

 

以上是关于Swift的访问控制讲解的主要内容,如果未能解决你的问题,请参考以下文章

开心档之Swift 访问控制

Swift 访问控制

Swift学习之访问控制详解

Swift23-访问控制

Swift23-访问控制

谈Swift中的访问控制