Swift架构 - Scope and Lifetime
在 Swift 程序中,事物有一个作用域。这是指他们被其他事物看到的能力。事物嵌套在其他事物中,形成事物的嵌套层次结构。规则是,事物可以在自己的层次上看到事物,也可以在包含它们的更高层次上看到事物。级别如下:
- 模块是一个作用域
- 文件是一个作用域
- 花括号是一个作用域
在 Swift 程序中,事物有一个作用域。这是指他们被其他事物看到的能力。事物嵌套在其他事物中,形成事物的嵌套层次结构。规则是,事物可以在自己的层次上看到事物,也可以在包含它们的更高层次上看到事物。级别如下:
Swift 程序可以由一个文件或多个文件组成。在 Swift 中,文件是一个有意义的单元,对于可以放入其中的 Swift 代码的结构有明确的规则。只有某些内容可以放在 Swift 文件的顶层-主要是以下内容:
模块import
语句
模块是比文件更高级的单元。一个模块可以由多个文件组成,这些文件都可以自动看到对方。你的应用程序的文件属于一个单独的模块,可以看到彼此。但是如果没有import
语句,一个模块就不能看到另一个模块。这就是你在 iOS 程序中与 Cocoa 对话的方式:文件的第一行写着import UIKit
。
可执行代码,如fido.bark()
或one = two
或print("hello")
,不能直接进入程序的任何地方。不了解这一事实是初学者常见的错误,并可能导致一个神秘的编译错误消息,如“预期声明”。
一般来说,可执行代码必须存在于函数体中。函数是一批代码,可以作为批处理,来运行。它的主体由花括号分隔。通常,函数有一个名称,它通过函数声明获得这个名称。函数声明语法是稍后要补充的另一个细节,但这里有一个例子:
变量是对象的名称。从技术上讲,它指向一个对象;它是一个对象的引用。从非技术上讲,你可以把它想象成一个放置物品的鞋盒。这个对象可能会发生变化,或者它可能会在鞋盒内被另一个对象取代,但名称本身具有完整性。变量指向的对象是变量的值。
在 Swift 中,没有变量隐式地存在;所有变量都必须声明。如果你需要一个名字,你必须说“我正在创建一个名字”。您可以使用两个关键字中的一个: let
或 var
。在 Swift 中,声明通常伴随着初始化——作为声明的一部分,您使用等号立即给变量一个值。这两个都是变量声明(和初始化):
如果你了解 Objective-C 或其他面向对象语言,你可能会对 Swift 关于对象 1 的概念感到惊讶。在许多语言中,例如 Objective-C,对象是一个类或类的实例(我将在后面解释什么是实例)。Swift 有类,但 Swift 中的 1 既不是类,也不是类的实例: 1 的类型,即Int
,是一个struct
,1 是一个结构体的实例。Swift 还有另一种可以发送消息的东西,叫做enum
。
Swift 说:“一切都是对象。”这是各种现代面向对象语言的共同自夸,但它意味着什么呢?好吧,这取决于你对“对象”的定义——以及你对“一切”的定义。
让我们从规定对象开始,粗略地说,是可以向其发送消息的东西。消息,粗略地说,是一种命令式指令。例如,你可以对狗下命令:“汪汪!”“坐!”在这个类比中,这些短语是消息,而狗是你发送这些消息的对象。
在 Swift 中,消息发送的语法是点表示法。我们从对象开始;然后有一个点(句号);然后是消息。(有些消息后面也有括号,但现在忽略它们;消息发送的完整语法是我们稍后要补充的细节之一。)这是有效的 Swift 语法:
1 | fido.bark() |
一个完整的 Swift 命令是一个语句。Swift 文本文件是由多行组成的文本。换行符是有意义的。一个程序的典型布局是一条语句一行:
1 | print("hello") |
( print
命令在 Xcode 控制台中提供即时反馈)