传统建议新语言的第一个程序应该打印“Hello, world!”字样。屏幕上。在 Swift 中,这可以在一行中完成:
-
1. print("Hello, world!") 2. // Prints "Hello, world!"
如果你用 C 或 Objective-C 写过代码,你会觉得这个语法很熟悉——在 Swift 中,这行代码就是一个完整的程序。您不需要为输入/输出或字符串处理等功能导入单独的库。在全局范围内编写的代码用作程序的入口点,因此您不需要main()
函数。您也不需要在每个语句的末尾写分号。
本教程通过向您展示如何完成各种编程任务,为您提供了足够的信息来开始使用 Swift 编写代码。如果您有什么不明白的地方,请不要担心——本书的其余部分详细解释了本次导览中介绍的所有内容。
简单值
用于let
生成常量和var
生成变量。编译时不需要知道常量的值,但必须只为其赋值一次。这意味着您可以使用常量来命名一个您确定一次但在许多地方使用的值。
-
1. var myVariable = 42 2. myVariable = 50 3. let myConstant = 42
常量或变量必须与要分配给它的值具有相同的类型。但是,您不必总是显式地编写类型。在创建常量或变量时提供值可以让编译器推断其类型。在上面的例子中,编译器推断它myVariable
是一个整数,因为它的初始值是一个整数。
如果初始值没有提供足够的信息(或者不是初始值),请在变量后面写上它来指定类型,用冒号分隔。
-
1. let implicitInteger = 70 2. let implicitDouble = 70.0 3. let explicitDouble: Double = 70
值永远不会隐式转换为另一种类型。如果需要将值转换为不同的类型,请明确创建所需类型的实例。
-
1. let label = "The width is " 2. let width = 94 3. let widthLabel = label + String(width)
实验
尝试String
从最后一行中删除转换为。你得到什么错误?
在字符串中包含值还有一种更简单的方法:将值写在括号中,并在括号\
前写一个反斜杠 ( )。例如:
-
1. let apples = 3 2. let oranges = 5 3. let appleSummary = "I have \(apples) apples." 4. let fruitSummary = "I have \(apples + oranges) pieces of fruit."
实验
用于\()
在字符串中包含浮点计算以及在问候语中包含某人的姓名。
"""
对占用多行的字符串使用三个双引号 ( )。删除每个引用行开头的缩进,只要它与右引号的缩进相匹配。例如:
-
1. let quotation = """ 2. I said "I have \(apples) apples." 3. And then I said "I have \(apples + oranges) pieces of fruit." 4. """
使用方括号 ( []
)创建数组和字典,并通过在方括号中写入索引或键来访问它们的元素。最后一个元素后允许有逗号。
-
1. var shoppingList = ["catfish", "water", "tulips"] 2. shoppingList[1] = "bottle of water" 3. 4. var occupations = [ 5. "Malcolm": "Captain", 6. "Kaylee": "Mechanic", 7. ] occupations["Jayne"] = "Public Relations"
添加元素时,数组会自动增长。
-
1. shoppingList.append("blue paint") 2. print(shoppingList)
要创建空数组或字典,请使用初始化语法。
-
1. let emptyArray: [String] = [] 2. let emptyDictionary: [String: Float] = [:]
如果可以推断类型信息,您可以编写一个空数组 as[]
和一个空字典 as [:]
— 例如,当您为变量设置新值或将参数传递给函数时。
-
1. shoppingList = [] 2. occupations = [:]
控制流
使用if
和switch
制作条件语句和使用for
- in
,while
和repeat
-while
进行循环。条件或循环变量周围的括号是可选的。身体周围需要大括号。
-
1. let individualScores = [75, 43, 103, 87, 12] 2. var teamScore = 0 3. for score in individualScores { 4. if score > 50 { 5. teamScore += 3 6. } else { 7. teamScore += 1 8. } 9. } 10. print(teamScore) 11. // Prints "11"
在if
语句中,条件必须是布尔表达式——这意味着诸如此类的代码是一个错误,而不是与零的隐式比较。if score { ... }
您可以使用if
和let
一起处理可能丢失的值。这些值表示为可选项。可选值要么包含一个值,要么包含nil
以指示缺少某个值。?
在值的类型后写一个问号 ( ) 以将该值标记为可选。
-
1. var optionalString: String? = "Hello" 2. print(optionalString == nil) 3. // Prints "false" 4. 5. var optionalName: String? = "John Appleseed" 6. var greeting = "Hello!" 7. if let name = optionalName { 8. greeting = "Hello, \(name)" 9. }
实验
更改optionalName
为nil
。你收到什么问候?添加一个else
子句,如果optionalName
is设置不同的问候语nil
。
如果可选值为nil
,则条件为false
并且跳过大括号中的代码。否则,可选值被解包并分配给常量 after let
,这使得解包值在代码块内可用。
处理可选值的另一种方法是使用??
运算符提供默认值。如果缺少可选值,则使用默认值代替。
-
1. let nickname: String? = nil 2. let fullName: String = "John Appleseed" 3. let informalGreeting = "Hi \(nickname ?? fullName)"
开关支持任何类型的数据和各种各样的比较操作——它们不限于整数和相等性测试。
-
1. let vegetable = "red pepper" 2. switch vegetable { 3. case "celery": 4. print("Add some raisins and make ants on a log.") 5. case "cucumber", "watercress": 6. print("That would make a good tea sandwich.") 7. case let x where x.hasSuffix("pepper"): 8. print("Is it a spicy \(x)?") 9. default: 10. print("Everything tastes good in soup.") 11. } 12. // Prints "Is it a spicy red pepper?"
实验
尝试删除默认情况。你得到什么错误?
请注意如何let
在模式中使用 将与模式匹配的值分配给常量。
执行匹配的 switch case 内的代码后,程序退出 switch 语句。执行不会继续到下一个案例,因此您不需要在每个案例代码的末尾明确跳出开关。
您可以使用for
-in
通过为每个键值对提供一对名称来迭代字典中的项目。字典是一个无序的集合,所以它们的键和值以任意顺序迭代。
-
1. let interestingNumbers = [ 2. "Prime": [2, 3, 5, 7, 11, 13], 3. "Fibonacci": [1, 1, 2, 3, 5, 8], 4. "Square": [1, 4, 9, 16, 25], 5. ] 6