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的访问控制讲解的更多相关文章

  1. swift 2.2 语法 (下)

    前言: 1.此文中的语法会根据Swift的升级变动而更新. 2.如果需要请移步 -> swift2.2 语法(上).swift 2.2语法(中) 类的析构函数 swift会自动释放不需要的实例来 ...

  2. [译] 用 Swift 创建自定义的键盘

    本文翻译自 How to make a custom keyboard in iOS 8 using Swift 我将讲解一些关于键盘扩展的基本知识,然后使用iOS 8 提供的新应用扩展API来创建一 ...

  3. 用函数式的 Swift 实现图片转字符画的功能

    今天整理 Pocket 中待看的文章,看到这篇<Creating ASCII art in functional Swift>,讲解如何用 Swift 将图片转成 ASCII 字符.具体原 ...

  4. Swift5 语言指南(二十七) 访问控制

    访问控制限制从其他源文件和模块中的代码访问部分代码.此功能使您可以隐藏代码的实现细节,并指定一个首选接口,通过该接口可以访问和使用该代码. 您可以为各个类型(类,结构和枚举)以及属于这些类型的属性,方 ...

  5. OC跟Swift混编

    OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue  独立博客:http://mengxiangyue ...

  6. iOS学习笔记49-Swift(九)访问控制

    一.Swift的访问控制 Swift中的访问控制模型基于模块和源文件这两个概念 模块指的是Framework或App bundle.在Swift中,可以用import关键字引入自己的工程. 源文件指的 ...

  7. [充电][ios]ios充电接口

    知乎推荐:http://www.zhihu.com/topic/19693633/top-answers 外文教学网站: http://www.raywenderlich.com/ 著作权归作者所有. ...

  8. 如何学习ios开发

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Franz Fang链接:http://www.zhihu.com/question/20264108/answer/3026 ...

  9. ios 好去处

    1.王巍的博客(我们都叫它喵神,他很萌哒) 链接:http://onevcat.com/ (难度指数:※※※※※)理由:他的swift的新书讲解的非常好,但不适合入门,进阶的话这是很适合的一本书.其他 ...

随机推荐

  1. 【struts2+hibernate4】小型电子商务站点

    这里使用的是struts2和hibernate4两个框架开发的一个小型电子商务站点,数据库方面我也会给出对应的代码. 总之使用的是:struts2+hibernate4+jsp+MySQL+tomca ...

  2. TCP的三次握手和四次挥手【经典】

    参考:http://blog.csdn.net/cmm0401/article/details/77865479

  3. WPF:WebBrowser提示 为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容

    原文:WPF:WebBrowser提示 为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://bl ...

  4. 【v2.x OGE课程 15】 布局相关

    1.父亲和儿子的关系 我们可以Entity类看到非常多parent(父)与child(子)这种字眼,这是游戏引擎中常有的概念,简单而言是一种has-a的关系 watermark/2/text/aHR0 ...

  5. Base64实现测试,不要太相信apache-common的性能

    针对三种Base64实现: * 自已实现的 * JDK8的java.util.Base64 * apache-common的org.apache.commons.codec.binary.Base64 ...

  6. 关于JSP

    JSP的本质 JSP本质上就是Servlet, 正常情况下, 它会在第一次被访问的时候被容器转化成Java代码, 然后再从Java代码编译成.class文件, 之后实际就和Servlet没区别了, 也 ...

  7. js,css引用顺序设定

    遇到的困难 在ASP .NET MVC里面,会使用_Layout.cshtml来绘制一些全局的公共页面,以及引用相关的css和js而在每个独立的页面中,也有自己独立的js一般来说,希望公共的js放在独 ...

  8. C# WindowsPrincipal(Windows规则)的使用

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Principal;usin ...

  9. wcf 代理实例

    通过过代理调用 wcf服务 using Microsoft.Extensions.Options; using System; using System.Collections.Generic; us ...

  10. c# 自定义公共类CallFunction-调用函数信息帮助类

    /// <summary> /// 调用函数信息 /// </summary> public class CallFunction { /// <summary> ...