Swift

Swift - Access Control

2019-04-11  本文已影响0人  ienos

访问控制模型是基于 Modules & Source Files
作用:隐藏代码的实现,指定接口能够被访问和使用

Module

Source File

五种访问等级

从高到低:open / public / internal / fileprivate / private

Open & Public

Internal

File-private

Private

Open 只能用于类和类成员,以下几点不同于 Public

✨访问权限的原则

实体不能被另外一个低访问权限的实体定义
eg:

默认访问等级 - internal

Unit Test Targets

除了标记 Open 和 Public,能够访问任何 internal 实体的方式:在 import module 前加 @testable

Frameworks

open / public 修饰 API

自定义类型

fileprivate class SomeFilePrivateClass {
    func someFilePrivateMethod() {}
    private func somePrivateMethod() {} 
}

元祖类型

整个元祖类型的访问权限,决定于元祖中所有类型的最低访问权限,不能特指访问权限

方法类型

方法类型的访问权限,决定于方法参数类型和返回值类型的最低访问权限

func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // function implementation goes here
}
// 也许会期望方法的默认访问权限为 internal,但是实际上取决于元祖类型 
// 并且在这里不能用 public 和 internal 修饰改方法

枚举类型

嵌套类型

子类化

public class A {
    fileprivate func someMethod() {}
}

internal class B: A {
    override internal func someMethod(){
      super.someMethod()
  }
}

常量、变量、属性和下标

private var privateInstance = SomePrivateClass()

Setter and Getter

struct TrackedString {
// setter: private ; getter: internal
    private(set) var numberOfEdits = 0
    var value: String = "" {
          didSet {
              numberOfEdit += 1
          }
    }
}
public struct TrackedString {
    // 默认是 getter internal;此时设置为 getter public
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
          didSet {
                numberOfEdits += 1
          }
    }
    public init() {}
}

初始化

默认初始化器

结构体类型的默认 Memberwise 初始化器

协议

-requirement 自动设置与协议相同的访问等级,并且不能设置与其不同的等级,以确保所有 requirement 能够有效适用任何遵循该协议的类型

协议继承

最高访问权限为父协议的等级

协议遵循

遵循协议是全局的:一个类型不能以两种不同的方式遵循一个协议

Extensions

class / structure / enumeration

在 Extension 中的私有成员

泛型

泛型类型 / 泛型方法 level = minimum (泛型类型 / 泛型方法,类型参数上的类型约束)

类型别名

类型别名 level <= 类型 level

上一篇 下一篇

猜你喜欢

热点阅读