码迷,mamicode.com
首页 > 编程语言 > 详细

Swift的访问控制讲解

时间:2019-07-01 17:03:47      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:访问控制   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关键字将实体的使用限制在定义它的源文件中.如下:

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的访问控制讲解

标签:访问控制   str   open   私有   color   extension   ble   turn   UNC   

原文地址:https://www.cnblogs.com/guohai-stronger/p/11114722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!