讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 1.6 Swift文件的結構 >

1.6 Swift文件的結構

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 {}
}  

顯然,可以一直遞歸下去:類聲明中可以包含類聲明,裡面的類聲明中還可以包含類聲明,以此類推。不過這麼做毫無意義。