前言
和Apple
官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift
语言的一些概念和用法,方便大家更好地学习和掌握Swift
语言。
这同时也是对自己学习Swift
语言过程的知识整理。
如有错误,以你为准。
项目创建
我们新建一个PlayGround
项目,命名为SwiftAccessControl
。
访问控制的定义
访问控制,是数据安全的一个基本组成部分,它规定了哪些源文件和模块中的代码可以访问我们写的代码。
通过访问控制,我们可以给类、结构体、枚举设置访问级别,也可以给这些类型的属性、函数、初始化方法、基本类型、下标索引等设置访问级别。
其他概念的定义
模块:以独立单元构建和发布的Framework框架或Application应用。
源文件:单个源码文件,包含多个类和函数的定义。
访问控制的级别
Swift
提供了4种访问级别:public、internal、fileprivate、private
。
关键字 |
访问级别 |
描述 |
public |
完全公开 |
最高级别。可以访问自己模块中源文件的任何实体,其他人也可以通过引用这个模块访问源文件里面的实体 |
internal |
内部使用 |
可以访问自己模块中源文件的实体,其他人不能访问 |
fileprivate |
文件外私有 | 只能在源文件内部使用 |
private |
完全私有 |
最低访问级别,只能在类中访问 |
一般情况下,如果我们不指定访问级别,那么我们代码中的所有实体都默认是internal
级别。
访问控制的使用
我们可以通过修饰符public、internal、fileprivate、private
来声明实体的访问级别。示例:
import UIKit public class PublicClass {} //完全公开 internal class InternalClass {} //内部使用 fileprivate class FilePrivateClass {} //文件外私有 private class PrivateClass {} //完全私有 class SomeInternalClass {} //默认是内部使用类型
在Swift
语言中,由于系统能够自动根据参数判断类型,这称之为隐性声明。
当我们给类、结构体等显性声明了一个类型,那么这个类或结构体内的所有成员的访问内容都跟随显性声明的类型,这称之为传递。
自定义访问级别
我们也可以通过自定义类型的方式,给类、结构体、参数指定不同的访问控制级别,以达到不同场景的使用。示例:
//自定义类型 class Person { var name:String = "文如秋雨" fileprivate func fullName() {} private func getUser() {} }
上述代码中,我们定义了一个类Person
,我们没有声明其访问级别,因此默认为隐性的internal
级别。
我们声明了一个String
类型的name
变量,由于传递的特点,它也是隐性的internal
级别。
然后我们定义了一个fileprivate
访问级别的方法fullName
,和一个private
访问级别的方法getUser
。
访问权限的取级
上述例子为单独的类的访问级别声明,当我们使用函数时,可能存在多个类,多个类分别属于不同的访问级别。
这时候,我们则根据函数返回类型的最低访问级别作为该函数的访问级别。示例:
//函数访问级别 func function() -> (FilePrivateClass, PrivateClass) { // 函数实现 }
上述代码中,我们定义了一个全局函数function
,没有指定其访问级别,按照我们之前学习的访问控制的知识点,它是隐性的internal
级别。
但由于该函数中一个类FilePrivateClass
为fileprivate
访问级别,另一个类PrivateClass
是private
访问级别。
因此,这个函数根据其返回值类型的最低访问级别定义,则整个函数function
为隐性private
访问级别。
枚举类、结构体亦是如此。而有子类继承父类的情况下,子类的访问级别不得高于父类的访问级别。
总的来说,访问级别是向下取级的。
本章代码
import UIKit public class PublicClass {} //完全公开 internal class InternalClass {} //内部使用 fileprivate class FilePrivateClass {} //文件外私有 private class PrivateClass {} //完全私有 class SomeInternalClass {} //默认是内部使用类型 //自定义类型 class Person { var name:String = "文如秋雨" fileprivate func fullName() {} private func getUser() {} } //函数访问级别 func function() -> (FilePrivateClass, PrivateClass) { // 函数实现 }
以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~