基础知识
Swift 是一种用于 iOS、macOS、watchOS 和 tvOS 应用程序开发的新编程语言。尽管如此,根据您使用 C 和 Objective-C 进行开发的经验,您将熟悉 Swift 的许多部分。
雨燕提供了自己的所有基本C和Objective-C类型的版本,包括Int
为整数,Double
并Float
为浮点值,Bool
布尔值,并String
为文本数据。Swift 还提供了三种主要集合类型Array
、Set
、 和 的强大版本Dictionary
,如集合类型 中所述。
与 C 一样,Swift 使用变量来存储和通过标识名称引用值。Swift 还广泛使用了无法更改其值的变量。这些被称为常量,并且比 C 中的常量强大得多。当您使用不需要更改的值时,常量在整个 Swift 中使用以使代码更安全、更清晰。
除了熟悉的类型之外,Swift 还引入了 Objective-C 中没有的高级类型,例如元组。元组使您能够创建和传递值的分组。您可以使用元组将函数中的多个值作为单个复合值返回。
Swift 还引入了可选类型,用于处理没有值的情况。选配说要么“有是一个值,它等于X ”或“有没有一个价值可言”。使用可选项类似于nil
在 Objective-C 中使用指针,但它们适用于任何类型,而不仅仅是类。可选项不仅比nil
Objective-C 中的指针更安全和更具表现力,而且它们是 Swift 中许多最强大功能的核心。
Swift 是一种类型安全的语言,这意味着该语言可以帮助您明确代码可以使用的值的类型。如果您的代码的一部分需要String
,类型安全可以防止您Int
错误地传递它。同样,类型安全可防止您意外地将 optional 传递String
给需要非可选String
. 类型安全可帮助您在开发过程中尽早发现和修复错误。
常量和变量
常量和变量将名称(例如maximumNumberOfLoginAttempts
或welcomeMessage
)与特定类型的值(例如数字10
或字符串"Hello"
)相关联。常量的值一旦设置就不能更改,而变量可以在将来设置为不同的值。
声明常量和变量
常量和变量必须在使用前声明。用let
关键字声明常量,用关键字声明变量var
。下面是一个示例,说明如何使用常量和变量来跟踪用户进行的登录尝试次数:
-
1. let maximumNumberOfLoginAttempts = 10 2. var currentLoginAttempt = 0
这段代码可以读作:
“声明一个名为 的新常量maximumNumberOfLoginAttempts
,并赋予它一个值10
。然后,声明一个名为 的新变量currentLoginAttempt
,并为其赋予初始值0
。”
在此示例中,允许的最大登录尝试次数声明为常量,因为最大值永远不会改变。当前登录尝试计数器被声明为一个变量,因为该值必须在每次登录尝试失败后递增。
您可以在一行中声明多个常量或多个变量,用逗号分隔:
-
var x = 0.0, y = 0.0, z = 0.0
笔记
如果代码中存储的值不会更改,请始终使用let
关键字将其声明为常量。变量仅用于存储需要能够更改的值。
类型注释
您可以在声明常量或变量时提供类型注释,以明确常量或变量可以存储的值类型。通过在常量或变量名称之后放置一个冒号,然后是一个空格,然后是要使用的类型的名称来编写类型注释。
此示例为名为 的变量提供了类型注释welcomeMessage
,以指示该变量可以存储String
值:
- var welcomeMessage: String
声明中的冒号表示“……类型……”,因此上面的代码可以理解为:
“声明一个welcomeMessage
类型为 的变量String
。”
短语“of type String
”的意思是“可以存储任何String
值”。将其视为可以存储的“事物的类型”(或“事物的种类”)。
welcomeMessage
现在可以将该变量设置为任何字符串值而不会出错:
- welcomeMessage = “Hello”
您可以在一行中定义多个相同类型的相关变量,以逗号分隔,并在最终变量名称后使用单个类型注释:
- var red, green, blue: Double
笔记
在实践中很少需要编写类型注释。如果您在定义常量或变量时为其提供初始值,Swift 几乎总能推断出要用于该常量或变量的类型,如类型安全和类型推断中所述。在welcomeMessage
上面的例子中,没有提供初始值,所以welcomeMessage
变量的类型是用类型注释指定的,而不是从初始值推断出来的。
命名常量和变量
常量和变量名称几乎可以包含任何字符,包括 Unicode 字符:
- let π = 3.14159
- let 你好 = “你好世界”
- let 🐶🐮 = “dogcow”
常量和变量名称不能包含空格字符、数学符号、箭头、专用 Unicode 标量值或线条和方框图字符。它们也不能以数字开头,尽管数字可能包含在名称的其他地方。
一旦声明了某个类型的常量或变量,就不能再用相同的名称声明它,也不能将其更改为存储不同类型的值。你也不能把一个常数变成一个变量或一个变量变成一个常数。
笔记
如果您需要为常量或变量赋予与 Swift 保留关键字相同的名称,请```在将其用作名称时用反引号 ( )将关键字括起来。但是,除非您绝对别无选择,否则请避免使用关键字作为名称。
您可以将现有变量的值更改为兼容类型的另一个值。在本例中, 的值friendlyWelcome
从 更改"Hello!"
为"Bonjour!"
:
-
1. var friendlyWelcome = "Hello!" 2. friendlyWelcome = "Bonjour!" 3. // friendlyWelcome is now "Bonjour!"
与变量不同,常量的值在设置后不能更改。尝试这样做会在编译代码时报告为错误:
-
1. let languageName = "Swift" 2. languageName = "Swift++" 3. // This is a compile-time error: languageName cannot be changed.
打印常量和变量
您可以使用以下print(_:separator:terminator:)
函数打印常量或变量的当前值:
-
1. print(friendlyWelcome) 2. // Prints "Bonjour!"
该print(_:separator:terminator:)
函数是一个全局函数,可将一个或多个值打印到适当的输出。例如,在 Xcode 中,该print(_:separator:terminator:)
函数在 Xcode 的“控制台”窗格中打印其输出。该separator
和terminator
参数都有默认值,这样你就可以当你调用这个函数忽略它们。默认情况下,该函数通过添加换行符来终止它打印的行。要打印一个没有换行符的值,请传递一个空字符串作为终止符——例如,. 有关具有默认值的参数的信息,请参阅默认参数值。print(someValue, terminator: "")
Swift 使用字符串插值将常量或变量的名称作为占位符包含在较长的字符串中,并提示 Swift 将其替换为该常量或变量的当前值。将名称括在括号中,并在左括号前用反斜杠将其转义:
-
1. print("The current value of friendlyWelcome is \(friendlyWelcome)") 2. // Prints "The current value of friendlyWelcome is Bonjour!"
笔记
你可以用串插中使用的所有选项中描述字符串插值。
注释
使用注释在代码中包含不可执行的文本,作为对自己的注释或提醒。编译代码时,Swift 编译器会忽略注释。
Swift 中的注释与 C 中的注释非常相似。单行注释以两个正斜杠 ( //
)开头:
-
// This is a comment.
多行注释以正斜杠开头,后跟星号 ( /*
),以星号结尾,后跟正斜杠 ( */
):
-
/* This is also a comment but is written over multiple lines. */
与 C 中的多行注释不同,Swift 中的多行注释可以嵌套在其他多行注释中。您可以通过启动一个多行注释块然后在第一个块中启动第二个多行注释来编写嵌套注释。然后关闭第二个块,然后关闭第一个块:
-
/* This is the start of the first multiline comment. /* This is the second, nested multiline comment. */ This is the end of the first multiline comment. */
嵌套的多行注释使您能够快速轻松地注释掉大块代码,即使代码已经包含多行注释。
分号
与许多其他语言不同,Swift 不要求您;
在代码中的每个语句之后编写分号 ( ),尽管您可以根据需要这样做。但是,如果要在一行中编写多个单独的语句,则需要分号:
-
1. let cat = "🐱"; print(cat) 2. // Prints "🐱"
整数
整数是没有小数部分的整数,例如42
和-23
。整数有符号(正、零或负)或无符号(正或零)。
Swift 提供 8、16、32 和 64 位形式的有符号和无符号整数。这些整数遵循类似于 C 的命名约定,其中 8 位无符号整数的类型为UInt8
,而 32 位有符号整数的类型为Int32
。与 Swift 中的所有类型一样,这些整数类型的名称大写。
整数边界
您可以使用其min
和max
属性访问每个整数类型的最小值和最大值:
-
1. let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8 2. let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
这些属性的值是适当大小的数字类型(例如UInt8
在上面的示例中),因此可以在表达式中与相同类型的其他值一起使用。
整数
在大多数情况下,您不需要选择特定大小的整数来在您的代码中使用。Swift 提供了一个额外的整数类型,Int
,它的大小与当前平台的原生字大小相同:
- 在 32 位平台上,
Int
与Int32
. - 在 64 位平台上,
Int
与Int64
.
除非您需要使用特定大小的整数,否则请始终Int
在代码中使用整数值。这有助于代码一致性和互操作性。即使在 32 位平台上,Int
也可以存储-2,147,483,648
和之间的任何值2,147,483,647
,并且对于许多整数范围来说都足够大。
用户界面
Swift 还提供了一个无符号整数类型,UInt
它的大小与当前平台的原生字大小相同:
- 在 32 位平台上,
UInt
与UInt32
. - 在 64 位平台上,
UInt
与UInt64
.
笔记
UInt
仅当您特别需要与平台的本机字大小相同大小的无符号整数类型时才使用。如果不是这种情况,Int
则是首选,即使要存储的值已知为非负值也是如此。一致使用Int
for 整数值有助于代码互操作性,避免在不同数字类型之间进行转换的需要,并匹配整数类型推断,如类型安全和类型推断中所述。
浮点数字
浮点数是具有小数部分的数字,例如3.14159
,0.1
,和-273.15
。
浮点类型可以表示比整数类型更广泛的值,并且可以存储比Int
. Swift 提供了两种有符号浮点数类型:
Double
表示 64 位浮点数。Float
表示一个 32 位浮点数。
笔记
Double
具有至少 15 位十进制数字的精度,而 的精度Float
可以低至 6 位十进制数字。要使用的适当浮点类型取决于您需要在代码中使用的值的性质和范围。在任何一种类型都合适的情况下,Double
是首选。
类型安全和类型推断
Swift 是一种类型安全的语言。类型安全语言鼓励您明确代码可以使用的值类型。如果您的代码的一部分需要String
,则不能Int
错误地传递它。
因为 Swift 是类型安全的,所以它在编译代码时会执行类型检查,并将任何不匹配的类型标记为错误。这使您能够在开发过程中尽早发现和修复错误。
类型检查可帮助您在处理不同类型的值时避免错误。但是,这并不意味着您必须指定您声明的每个常量和变量的类型。如果你没有指定你需要的值的类型,Swift 会使用类型推断来计算出合适的类型。类型推断使编译器能够在编译您的代码时自动推断特定表达式的类型,只需检查您提供的值即可。
由于类型推断,Swift 需要的类型声明比 C 或 Objective-C 等语言少得多。常量和变量仍然是显式类型的,但是指定它们的类型的大部分工作已经为您完成了。
当您使用初始值声明常量或变量时,类型推断特别有用。这通常是通过在您声明常量或变量时为常量或变量分配一个文字值(或文字)来完成的。(文字值是直接出现在源代码中的值,如下面的42
和3.14159