26、【Swift】访问控制 - Access Control

2021-01-06  本文已影响0人  Sunday_David

对代码中可设置访问级别的特性(属性、基本类型、函数等),统一称之为“实体”(entities)。

模块和源文件 - Modules and Source Files

访问级别� - Access Levels

访问级别基本原则

默认访问级别

单 target 应用程序的访问级别

框架的访问级别 - Access Levels for Frameworks

内部实现仍可用默认 internal,隐藏细节可用 privatefileprivate

框架的对外 API 部分,需要将它们设置为 openpublic

单元测试 target 的访问级别

访问控制语法

public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
class SomeInternalClass {}   // 隐式 internal
var someInternalConstant = 0 // 隐式 internal

自定义类型

一个 public 类型的所有成员的访问级别默认为 internal 级别,而不是 public 级别

如果你想将某个成员指定为 public 级别,必须显式指定

这样做的好处是,在你定义公共接口的时候,可以明确地选择哪些接口是需要公开的,哪些是内部使用的,避免不小心将(类型)内部使用的接口公开


public class SomePublicClass {                  // 显式 public 类
    public var somePublicProperty = 0            // 显式 public 类成员
    var someInternalProperty = 0                 // 隐式 internal 类成员
    fileprivate func someFilePrivateMethod() {}  // 显式 fileprivate 类成员
    private func somePrivateMethod() {}          // 显式 private 类成员
}

class SomeInternalClass {                       // 隐式 internal 类
    var someInternalProperty = 0                 // 隐式 internal 类成员
    fileprivate func someFilePrivateMethod() {}  // 显式 fileprivate 类成员
    private func somePrivateMethod() {}          // 显式 private 类成员
}

fileprivate class SomeFilePrivateClass {        // 显式 fileprivate 类
    func someFilePrivateMethod() {}              // 隐式 fileprivate 类成员
    private func somePrivateMethod() {}          // 显式 private 类成员
}

private class SomePrivateClass {                // 显式 private 类
    func somePrivateMethod() {}                  // 隐式 private 类成员
}

元组类型

元组不同于类、结构体、枚举、函数那样有单独的定义。

一个元组的访问级别由元组中元素的访问级别来决定的,不能被显式指定。

函数类型

func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // 此处是函数实现部分
}
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // 此处是函数实现部分
}

DsCXJs.png

枚举类型

public enum CompassPoint {
    case north
    case south
    case east
    case west
}
// CompassPoint 被明确指定为 public,那么它的成员 north、south、east、west 的访问级别同样也是 public:

原始值和关联值

嵌套类型 - Nested Types

子类

DcNEDI.png
public class A {
         fileprivate func someMethod() {}
}
internal class B: A {
         override internal func someMethod() {}
}

常量、变量、属性、下标

private var privateInstance = SomePrivateClass()

Getter 和 Setter

这规则适用于存储型和计算型属性。

即使你不明确指定存储型属性GetterSetter,Swift 也会隐式创建 GetterSetter

struct TrackedString {
    private(set) var numberOfEdits = 0
    var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
}
var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("The number of edits is \(stringToEdit.numberOfEdits)")
// 打印“The number of edits is 3”
public struct TrackedString {
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
    public init() {}
}

构造器

默认构造器

结构体默认的成员逐一构造器

协议

协议继承

协议遵循

Swift 和 Objective-C 一样,协议遵循是全局的,也就是说,在同一程序中,一个类型不可能用两种不同的方式实现同一个协议。

扩展 - Extension

Extension 的私有成员

protocol SomeProtocol {
    func doSomething()
}
struct SomeStruct {
    private var privateVariable = 12
}

extension SomeStruct: SomeProtocol {
    func doSomething() {
        print(privateVariable)
    }
}

泛型

类型别名

这条规则也适用于为满足协议遵循而将类型别名用于关联类型的情况。

上一篇下一篇

猜你喜欢

热点阅读