Menu
CoddyTech

访问控制

本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 17 课,共 57 课。

封装是指类型控制其数据的使用方式。访问控制决定谁可以查看属性或方法。将成员标记为 private,可以使所有类型外部的代码(以及同一文件中的扩展)都无法访问它:

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        balance += amount
    }
}

var a = Account()
a.deposit(50)
// a.balance = 1_000_000   // 错误:由于 'private' 保护级别,无法访问 'balance'

外部代码之后只能使用该类型提供的内容。该类型可以检查每次更改,因此其中的数据不会变成该类型不允许的状态:

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        if amount > 0 { balance += amount }
    }

    func report() -> String {
        "balance: \(balance)"
    }
}

var a = Account()
a.deposit(50)
a.deposit(-999)
print(a.report())

输出:

balance: 50

Swift 有五种访问级别。如果没有关键字,成员就是 internal:在同一模块(你的应用或软件包)中随处可见。级别从最开放到限制最多依次为:

open        // 其他模块可以使用它,也可以创建它的子类(仅适用于类)
public      // 其他模块可以使用它
internal    // 默认:整个模块
fileprivate // 仅限此源文件
private     // 仅限此类型(及其在此文件中的扩展)

私有辅助方法可以让公共接口保持精简:调用者只需了解类型的作用,而不必了解它的实现方式。

struct Password {
    private let text: String

    init(_ text: String) { self.text = text }

    var isStrong: Bool {
        hasDigit() && text.count >= 8
    }

    private func hasDigit() -> Bool {
        text.contains { $0.isNumber }
    }
}

print(Password("secret123").isStrong)
print(Password("short1").isStrong)

输出:

true
false
challenge icon

挑战

简单

完成结构体 Locker。它的 code 和 items 是 private。只有代码匹配时,store(_:code:) 才会添加一个项目,并返回是否添加成功;代码匹配时,items(code:) 会返回用 , 连接的已存储项目(或 empty),否则返回 wrong code。

提供的代码会读取储物柜的代码,然后读取命令 put <code> <item> 或 open <code>。每条 put 命令都会输出 stored 或 denied,每条 open 命令都会输出对应结果。

你的代码应写在 Locker.swift 中。main.swift 包含提供的输入/输出代码,不能编辑。

亲手试试

// 提供的输入和输出代码:保持原样
var input: [String] = []
while let line = readLine() { input.append(line) }
var locker = Locker(code: input[0])
for cmd in input.dropFirst() {
    let p = cmd.split(separator: " ").map(String.init)
    if p[0] == "put" {
        print(locker.store(p[2], code: p[1]) ? "stored" : "denied")
    } else {
        print(locker.items(code: p[1]))
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Swift 在线编辑器