- Swift 教程
- Swift - 首页
- Swift - 概述
- Swift - 环境
- Swift - 基本语法
- Swift - 变量
- Swift - 常量
- Swift - 字面量
- Swift - 注释
- Swift 运算符
- Swift - 运算符
- Swift - 算术运算符
- Swift - 比较运算符
- Swift - 逻辑运算符
- Swift - 赋值运算符
- Swift - 位运算符
- Swift - 其他运算符
- Swift 高级运算符
- Swift - 运算符重载
- Swift - 算术溢出运算符
- Swift - 恒等运算符
- Swift - 范围运算符
- Swift 数据类型
- Swift - 数据类型
- Swift - 整数
- Swift - 浮点数
- Swift - Double
- Swift - 布尔值
- Swift - 字符串
- Swift - 字符
- Swift - 类型别名
- Swift - 可选值
- Swift - 元组
- Swift - 断言和前提条件
- Swift 控制流
- Swift - 决策语句
- Swift - if 语句
- Swift - if...else if...else 语句
- Swift - if-else 语句
- Swift - 嵌套 if 语句
- Swift - switch 语句
- Swift - 循环
- Swift - for in 循环
- Swift - while 循环
- Swift - repeat...while 循环
- Swift - continue 语句
- Swift - break 语句
- Swift - 穿透语句
- Swift 集合
- Swift - 数组
- Swift - 集合
- Swift - 字典
- Swift 函数
- Swift - 函数
- Swift - 嵌套函数
- Swift - 函数重载
- Swift - 递归
- Swift - 高阶函数
- Swift 闭包
- Swift - 闭包
- Swift - 转义和非转义闭包
- Swift - 自动闭包
- Swift 面向对象编程
- Swift - 枚举
- Swift - 结构体
- Swift - 类
- Swift - 属性
- Swift - 方法
- Swift - 下标
- Swift - 继承
- Swift - 重写
- Swift - 初始化
- Swift - 析构
- Swift 高级特性
- Swift - ARC 概述
- Swift - 可选链
- Swift - 错误处理
- Swift - 并发
- Swift - 类型转换
- Swift - 嵌套类型
- Swift - 扩展
- Swift - 协议
- Swift - 泛型
- Swift - 访问控制
- Swift - 函数与方法
- Swift - SwiftyJSON
- Swift - 单例类
- Swift 随机数
- Swift 不透明类型和装箱类型
- Swift 有用资源
- Swift - 在线编译
- Swift - 快速指南
- Swift - 有用资源
- Swift - 讨论
Swift - 访问控制
访问控制用于限制对代码或模块指定部分的访问。它防止未经授权的访问并实现封装。访问控制机制控制对类、结构体和枚举的方法和属性的访问。
协议中的常量、变量和函数受到限制,并允许通过访问控制以全局和局部方式访问。应用于属性、类型和函数的访问控制可以称为“实体”。
访问控制模型基于模块和源文件。模块定义为单个代码分发单元,可以使用关键字“import”导入。源文件定义为模块内的一个单个源代码文件,用于访问多个类型和函数。
Swift 中的访问级别
Swift 支持以下访问级别:
| 访问级别 | 定义 |
|---|---|
| 开放 (Open) | 这是限制最少的访问级别。它仅适用于类及其成员。它允许在另一个模块中对类和类成员进行子类化或重写。 |
| 公开 (Public) | 它允许从同一模块或不同模块内的任何源文件中访问实体。 |
| 内部 (Internal) | 它允许从定义它们的模块内的任何源文件中使用实体,但不允许在该模块之外使用。 |
| 私有 (Private) | 它将实体的使用限制在其自己的定义源文件中。它隐藏特定代码功能的实现细节。这是限制最严格的访问级别。 |
| 文件私有 (File-Private) | 它也限制实体的使用在其自己的定义源文件中。当这些细节在整个文件中使用时,它会隐藏特定代码功能的实现细节。 |
使用访问级别的规则
以下是开发人员在使用访问级别时必须了解的一些规则:
公开变量不能定义为内部、文件私有或私有。
函数的访问级别不能高于其参数和返回类型的访问级别。
所有实体的默认访问级别为内部。
单目标应用程序的默认访问级别为内部。
框架的默认访问级别为开放或公开。
语法
public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}
public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}
函数类型的访问控制
某些函数可能在函数内部声明参数,而没有任何返回值。以下程序将 a 和 b 声明为 sum() 函数的参数。在函数本身内部,通过调用函数调用 sum() 传递参数 a 和 b 的值,并打印其值,从而消除返回值。
要将函数的返回类型设为私有,请使用 private 修饰符声明函数的整体访问级别。
示例
演示函数类型访问控制的 Swift 程序。
// Private function
private func sum(a: Int, b: Int) {
let a = a + b
let b = a - b
print(a, b)
}
// Calling the function
sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)
输出
它将产生以下输出:
30 20 50 40 30 24
枚举类型的访问控制
Swift 中的枚举会自动为枚举的各个情况接收相同的访问级别。例如,考虑访问学生姓名和三门科目考试分数,枚举名称声明为 student,枚举类中存在的成员是属于字符串数据类型的名称,分数表示为 mark1、mark2 和 mark3,数据类型为整数。
访问他们获得的学生姓名或分数。现在,switch case 将打印学生的姓名(如果执行该 case 块),否则将打印学生获得的分数。
示例
演示枚举类型访问控制的 Swift 程序。
// Enumeration
public enum Student {
case Name(String)
case Mark(Int, Int, Int)
}
var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98, 97, 95)
switch studDetails {
case .Name(let studName):
print("Student name is: \(studName).")
case .Mark(let Mark1, let Mark2, let Mark3):
print("Student Marks are: \(Mark1), \(Mark2), \(Mark3).")
}
输出
它将产生以下输出:
Student name is: Swift.
子类的访问控制
Swift 允许用户对可在当前访问上下文中访问的任何类进行子类化。子类的访问级别不能高于其超类的访问级别。用户被限制为不能编写内部超类的公开子类。
示例
演示子类访问控制的 Swift 程序。
// Class
public class Cricket {
internal func display() {
print("Welcome to Swift Super Class")
}
}
// Subclass
internal class Tennis: Cricket {
override internal func display() {
print("Welcome to Swift Sub Class")
}
}
let cricketInstance = Cricket()
cricketInstance.display()
let tennisInstance = Tennis()
tennisInstance.display()
输出
它将产生以下输出:
Welcome to Swift Super Class Welcome to Swift Sub Class
常量、变量、属性和下标的访问控制
我们可以借助访问控制来控制常量、变量、属性和下标的可见性。当常量、变量、属性或下标使用私有类型时,则必须将该常量、变量、属性或下标标记为私有。
我们不能使用私有类型编写公开属性。类似地,下标的公开级别不能高于其返回类型。
示例
private var privateInstance = SomePrivateClass()
getter 和 setter 的访问控制
我们可以独立设置 getter 和 setter 的访问控制以控制其可见性。getter 和 setter 的访问级别由它们所属的常量、变量、属性或下标的访问级别决定。
示例
演示 getter 和 setter 访问控制的 Swift 程序。
class Samplepgm {
private var counter: Int = 0{
willSet(newTotal){
print("Total Counter is: \(newTotal)")
}
didSet{
if counter > oldValue {
print("Newly Added Counter \(counter - oldValue)")
}
}
}
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
输出
它将产生以下输出:
Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700
初始化器和默认初始化器的访问控制
在 Swift 中,我们可以为初始化器指定访问控制。对于自定义初始化器,我们可以分配小于或等于它们初始化的类型的访问级别。必需初始化器的访问级别必须与其所属的类相同。
而默认初始化器的访问级别与其初始化的类型相同,除非该类型定义为公开类型。当默认初始化器定义为公开时,它被认为是内部的。如果我们需要在另一个模块中使用无参数初始化器初始化公开类型,请在类型的定义中显式提供公开的无参数初始化器。
此外,初始化器的参数不能比初始化器自身的访问级别更私有。“required”关键字需要在 init() 函数之前定义,才能声明初始化器的每个子类。
示例
演示初始化器访问控制的 Swift 程序。
class ClassA {
required init() {
let a = 10
print(a)
}
}
class ClassB: ClassA {
required init() {
let b = 30
print(b)
}
}
let instanceA = ClassA()
let instanceB = ClassB()
输出
它将产生以下输出:
10 30 10
协议的访问控制
当我们定义一个新协议来继承现有协议的功能时,两者都必须声明相同的访问级别才能继承彼此的属性。Swift 访问控制不允许用户定义从“内部”协议继承的“公开”协议。
示例
演示协议访问控制的 Swift 程序。
// Public protocol
public protocol tcpprotocol {
init(no1: Int)
}
// Public class
public class mainClass {
var no1: Int
// Initializer
init(no1: Int) {
self.no1 = no1
}
}
// Class that uses protocol and class
class subClass: mainClass, tcpprotocol {
var no2: Int
init(no1: Int, no2 : Int) {
self.no2 = no2
super.init(no1:no1)
}
// Requires only one parameter for convenient method
required override convenience init(no1: Int) {
self.init(no1:no1, no2:0)
}
}
let obj1 = mainClass(no1: 20)
let obj2 = subClass(no1: 30, no2: 50)
print("res is: \(obj1.no1)")
print("res is: \(obj2.no1)")
print("res is: \(obj2.no2)")
输出
它将产生以下输出:
res is: 20 res is: 30 res is: 50
泛型的访问控制
泛型允许用户指定最小访问级别以访问其类型参数上的类型约束。
示例
演示泛型访问控制的 Swift 程序。
public struct TOS<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
let deletedTos = tos.pop()
输出
它将产生以下输出:
[Swift 4] [Swift 4, Generics] [Swift 4, Generics, Type Parameters] [Swift 4, Generics, Type Parameters, Naming Type Parameters]
类型别名的访问控制
在 Swift 中,我们可以定义类型别名来处理不同的访问控制类型。可以定义相同的访问级别或不同的访问级别。类型别名的访问级别可以小于或等于其引用的类型的访问级别。
当类型别名为“私有”时,其关联成员可以声明为“私有、内部或公开类型”。当类型别名为公开时,成员不能别名为“内部”或“私有”名称。
示例
演示类型别名访问控制的 Swift 程序。
// Defining a type alias with their access control
public typealias alias1 = Int
internal typealias alias2 = Double
// Class using the type aliases
class AliasClass {
var publicValue: alias1 = 33
var internalValue: alias2 = 18.22
func displayData() {
print("Public Value: \(publicValue)")
print("Internal Value: \(internalValue)")
}
}
// Creating instance of class
let obj = AliasClass()
obj.displayData()
输出
它将产生以下输出:
Public Value: 33 Internal Value: 18.22