Swift程序可以包含一個或多個文件。在Swift中,文件是一個有意義的單元,它通過一些明確的規則來確定Swift代碼的結構(假設不在main.swift文件中)。只有某些內容可以位於Swift文件的頂層部分,主要有如下幾個部分
模塊import語句
模塊是比文件更高層的單元。一個模塊可以包含多個文件,在Swift中,模塊中的文件能夠自動看到彼此;但如果沒有import語句,那麼一個模塊是看不到其他模塊的。比如,想想如何在iOS程序中使用Cocoa:文件的第1行會使用import UIKit。
變量聲明
聲明在文件頂層的變量叫作全局變量:只要程序還在運行,它就會一直存在。
函數聲明
聲明在文件頂層的函數叫作全局函數:所有代碼都能看到並調用它,無需向任何對像發送消息。
對像類型聲明
指的是類、結構體或是枚舉的聲明。
比如,下面是一個合法的Swift文件,包含(只是為了說明)一個import語句、一個變量聲明、一個函數聲明、一個類聲明、一個結構體聲明,以及一個枚舉聲明。
import UIKit var one = 1 func 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 UIKit var one = 1 func 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 {} }
顯然,可以一直遞歸下去:類聲明中可以包含類聲明,裡面的類聲明中還可以包含類聲明,以此類推。不過這麼做毫無意義。