Swift程序可以包含一个或多个文件。在Swift中,文件是一个有意义的单元,它通过一些明确的规则来确定Swift代码的结构(假设不在main.swift文件中)。只有某些内容可以位于Swift文件的顶层部分,主要有如下几个部分
模块import语句
模块是比文件更高层的单元。一个模块可以包含多个文件,在Swift中,模块中的文件能够自动看到彼此;但如果没有import语句,那么一个模块是看不到其他模块的。比如,想想如何在iOS程序中使用Cocoa:文件的第1行会使用import UIKit。
变量声明
声明在文件顶层的变量叫作全局变量:只要程序还在运行,它就会一直存在。
函数声明
声明在文件顶层的函数叫作全局函数:所有代码都能看到并调用它,无需向任何对象发送消息。
对象类型声明
指的是类、结构体或是枚举的声明。
比如,下面是一个合法的Swift文件,包含(只是为了说明)一个import语句、一个变量声明、一个函数声明、一个类声明、一个结构体声明,以及一个枚举声明。
import UIKitvar one = 1func changeOne {}class Manny {}struct Moe {}enum Jack {}
这个示例本身并没有什么意义,不过请记住,我们的目标是探求语言的组成部分与文件的结构,该示例仅仅是为了演示。
此外,示例中每一部分的花括号中还可以加入变量声明、函数声明与对象类型声明。事实上,任何结构化的花括号中都可以包含这些声明。比如,关键字if(Swift流程控制的一部分,第5章将会介绍)后面会跟着结构化的花括号,它们可以包含变量声明、函数声明与对象类型声明。如下代码虽然毫无意义,但却是合法的:
func silly { if true { class Cat {} var one = 1 one = one + 1 }}
你会发现我并没有说可执行代码可以位于文件的顶部,因为这是不行的。只有函数体可以包含可执行代码。函数自身可以包含任意深度的可执行代码;在上述代码中,one=one+1这一行可执行代码是合法的,因为它位于if结构中,而该if结构又位于函数体中。但one=one+1这一行不能位于文件顶层,也不能位于Cat声明的花括号中。
示例1-1是一个合法的Swift文件,其中概要地展示了其结构的各种可能性。(请忽略枚举声明中关于Jack的name变量声明;枚举中的顶层变量有一些特殊规则,稍后将会介绍。)
示例1-1:合法的Swift文件的概要结构
import UIKitvar one = 1func changeOne { let two = 2 func sayTwo { print(two) } class Klass {} struct Struct {} enum Enum {} one = two}class Manny { let name = "manny" func sayName { print(name) } class Klass {} struct Struct {} enum Enum {}}struct Moe { let name = "moe" func sayName { print(name) } class Klass {} struct Struct {} enum Enum {}}enum Jack { var name : String { return "jack" } func sayName { print(name) } class Klass {} struct Struct {} enum Enum {}}
显然,可以一直递归下去:类声明中可以包含类声明,里面的类声明中还可以包含类声明,以此类推。不过这么做毫无意义。