Swift Summary Book 项目解析:Swift 访问控制详解

Swift Summary Book 项目解析:Swift 访问控制详解

【免费下载链接】swift-summary A summary of Apple's Swift language written on Playgrounds 【免费下载链接】swift-summary 项目地址: https://gitcode.com/gh_mirrors/sw/swift-summary

访问控制基础概念

访问控制是 Swift 语言中一项重要的特性,它允许开发者限制代码中各个部分的访问权限。通过合理的访问控制,我们可以:

  1. 隐藏代码的实现细节
  2. 定义清晰的接口规范
  3. 提高代码的安全性和封装性

Swift 提供了三种主要的访问级别:

  • Public(公开):最高访问级别,允许实体在任何源文件中被访问,包括其他模块导入当前模块的情况。通常用于框架的公开 API。

  • Internal(内部):默认访问级别,允许实体在定义它们的模块内的任何源文件中被访问,但不能被模块外的代码访问。适用于应用程序或框架的内部结构。

  • Private(私有):最低访问级别,限制实体只能在定义它们的源文件中被访问。用于隐藏实现细节。

访问控制的基本原则

Swift 访问控制遵循一个核心原则:不能使用比当前实体访问级别更低的实体来定义新实体。这意味着:

  • 公共变量不能有私有类型
  • 公共函数的参数和返回类型不能是私有的
  • 公共类的父类不能是私有的

默认访问级别

在 Swift 中,如果没有显式指定访问级别,所有实体都会默认获得 Internal 访问级别。这使得在开发单一目标应用时,开发者通常不需要过多考虑访问控制问题。

对于框架开发者,则需要特别注意将公开接口标记为 Public,以便其他模块可以访问。

访问控制语法实践

Swift 中的访问控制语法简洁明了:

public class SomePublicClass {}       // 公开类
internal class SomeInternalClass {}  // 内部类(默认)
private class SomePrivateClass {}    // 私有类

public var somePublicVariable = 0    // 公开变量
internal let someInternalConstant = 0 // 内部常量(默认)
private func somePrivateFunction() {} // 私有函数

自定义类型的访问控制

为自定义类型指定访问级别时,需要注意以下几点:

  1. 类型的访问级别会影响其成员的默认访问级别
  2. 公共类型的成员默认是内部的,需要显式标记为公开
  3. 私有类型的成员默认是私有的

示例:

public class PublicClass {
    public var publicProperty = 0  // 必须显式标记为公开
    var internalProperty = 0      // 默认为内部
    private func privateMethod() {} // 私有方法
}

特殊类型的访问控制

元组类型

元组类型的访问级别是其组成类型中最严格的访问级别。例如,包含内部和私有类型的元组,其访问级别将是私有的。

函数类型

函数类型的访问级别是其参数类型和返回类型中最严格的访问级别。如果计算出的访问级别与上下文默认不符,必须显式指定。

private func someFunction() -> (InternalClass, PrivateClass) {
    // 返回类型包含私有类型,函数必须标记为私有
    return (InternalClass(), PrivateClass())
}

枚举类型

枚举的各个 case 自动获得与枚举相同的访问级别,不能为单个 case 指定不同的访问级别。

子类与访问控制

子类化时需要注意:

  1. 子类不能有比父类更高的访问级别
  2. 可以重写任何在当前访问上下文中可见的成员
  3. 重写可以使成员比父类版本更可访问
public class Parent {
    private func someMethod() {}
}

internal class Child: Parent {
    override internal func someMethod() { // 将私有方法提升为内部
        super.someMethod() // 允许调用,因为在同一源文件中
    }
}

属性与下标的访问控制

属性和下标不能比它们的类型更公开。可以为 setter 指定比 getter 更严格的访问级别:

struct TrackedString {
    private(set) var numberOfEdits = 0 // 外部只读,内部可写
    var value: String = "" {
        didSet { numberOfEdits += 1 }
    }
}

协议与扩展的访问控制

协议

  1. 协议中的每个要求自动获得与协议相同的访问级别
  2. 不能为协议要求指定不同的访问级别
  3. 协议继承时,新协议最多只能有与被继承协议相同的访问级别

扩展

扩展中的成员默认获得与被扩展类型相同的访问级别。可以为整个扩展指定不同的默认访问级别:

private extension SomeType {
    // 默认为私有
    func someMethod() {}
}

泛型与类型别名

  • 泛型类型的访问级别是其自身访问级别和类型参数约束中最严格的
  • 类型别名的访问级别不能超过原始类型的访问级别

实际应用建议

  1. 单一目标应用:主要使用默认的内部访问级别,对需要隐藏的实现细节使用私有级别
  2. 框架开发:明确标记公开接口为 public,内部实现使用 internal 或 private
  3. 代码组织:合理使用访问控制可以提高代码的可维护性和安全性

通过理解和合理应用 Swift 的访问控制机制,开发者可以构建出结构清晰、安全可靠的代码架构。

【免费下载链接】swift-summary A summary of Apple's Swift language written on Playgrounds 【免费下载链接】swift-summary 项目地址: https://gitcode.com/gh_mirrors/sw/swift-summary

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值