Menu
CoddyTech

文件操作

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

实际的程序会拆分成多个文件。在 Swift 中,应用的每个 .swift 文件都会一起编译成一个模块,因此,在一个文件中声明的函数或类型可以在其他任何文件中使用,无需导入:

// Greeting.swift
func greeting(for name: String) -> String {
    "Hello, \(name)!"
}

// main.swift
print(greeting(for: "Ada"))

运行此程序会输出 Hello, Ada!:main.swift 调用了定义在 Greeting.swift 中的函数。

只有一个文件可以包含顶层语句,也就是在任何函数或类型之外独立运行的代码。这个文件是 main.swift,程序从这里开始。其他文件只能包含声明:

// Greeting.swift
func greeting(for name: String) -> String { "Hello, \(name)!" }
// print("hi")      // 错误:这里不允许在顶层编写语句

// main.swift
let name = readLine() ?? "friend"   // 可以在 main.swift 中编写顶层代码
print(greeting(for: name))

通常的布局是每个文件放一种类型,并以该类型命名:Dog.swift 中存放 Dog,Account.swift 中存放 Account。在本单元的挑战中,你需要在这些文件中编写代码,而 main.swift 中存放提供的输入/输出代码,通常不能编辑。编辑器会将每个文件显示为一个标签页。

Dog.swift        // class Dog { ... }
Account.swift    // struct Account { ... }
main.swift       // 读取输入并打印结果

访问控制也适用于文件。private 和 fileprivate 会让其他文件无法访问某个声明,而默认访问级别 internal 会让模块中的每个文件都能访问它:

// Secret.swift
fileprivate let salt = "x7"          // 只有这个文件能访问它
func hashed(_ s: String) -> String { s + salt }

// main.swift
print(hashed("pw"))                  // 没问题:hashed 是 internal
// print(salt)                       // 错误:salt 是 fileprivate
challenge icon

挑战

简单

这个程序有两个文件。main.swift 会读取一个名字,并打印 greeting(for:) 的结果。在 Greeting.swift 中完成 greeting(for:),让它在名字为 Ada 时返回 Hello, Ada!,名字为空时返回 Hello, friend!。

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

亲手试试

// 提供的输入/输出代码:保持原样。
var input: [String] = []
while let line = readLine() { input.append(line) }
for name in input { print(greeting(for: name)) }
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Swift 在线编辑器