常量和变量
常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比如数字10或者字符串"Hello")关联起来。常量的值一旦设定就不能改变,而变量的值可以随意更改。
声明常量和变量
常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试登录的次数:
- let maximumNumberOfLoginAttempts = 10
- var currentLoginAttempt = 0
字符串字面量
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号包裹着的具有固定顺序的文本字符。字符串字面量可以用于为常量和变量提供初始值。
- let someString = "Some string literal value"
数组数组使用有序列表存储相同类型的多重数据。相同的值可以多次出现在一个数组的不同位置中。 由 于Swift 的类型推断机制,当我们用字面语句构造只拥有相同类型值数组的时候,我们不必把数组的类型 定义清楚。 shoppinglist的构造也可以这样写:
- var shoppingList = ["Eggs", "Milk"]
访问和修改数组我们可以通过数组的方法和属性来访问和修改数组,或者下标语法。 还可以使用数组的只读属性count来获取数组中的数据项数量。
- println("The shopping list contains \(shoppingList.count) items.")
- // 打印出"The shopping list contains 2 items."(这个数组有2个项)
也可以使用append方法在数组后面添加新的数据项:
- shoppingList.append("Flour")
- // shoppingList 现在有3个数据项,有人在摊煎饼
除此之外,使用加法赋值运算符(+=)也可以直接在数组后面添加数据项:
- shoppingList += "Baking Powder"
- // shoppingList 现在有四项了
我们也可以使用加法赋值运算符(+=)直接添加拥有相同类型数据的数组。
- shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
- // shoppingList 现在有7项了
可以直接使用下标语法来获取数组中的数据项,把我们需要的数据项的索引值放在直接放在数组名称的方括号中:
- var firstItem = shoppingList[0]
- // 第一项是 "Eggs"
我们也可以用下标来改变某个已有索引值对应的数据值:
- shoppingList[0] = "Six eggs"
- // 其中的第一项现在是 "Six eggs" 而不是 "Eggs"
还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的。下面的例子把"Chocolate Spread","Cheese",和"Butter"替换为"Bananas"和 "Apples":
- shoppingList[4...6] = ["Bananas", "Apples"]
- // shoppingList 现在有六项
调用数组的insert(atIndex:)方法来在某个具体索引值之前添加数据项:
- shoppingList.insert("Maple Syrup", atIndex: 0)
- // shoppingList 现在有7项
- // "Maple Syrup" 现在是这个列表中的第一项
这次insert函数调用把值为"Maple Syrup"的新数据项插入shopping列表的最开始位置,并且使用0作为索引值类似的我们可以使用removeAtIndex方法来移除数组中的某一项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项(我们不需要的时候就可以无视它):
- let mapleSyrup = shoppingList.removeAtIndex(0)
- //索引值为0的数据项被移除
- // shoppingList 现在只有6项,而且不包括Maple Syrup
- // mapleSyrup常量的值等于被移除数据项的值 "Maple Syrup"
字典我们可以使用字典字面语句来构造字典,他们和我们刚才介绍过的数组字面语句拥有相似语法。一个字典字面语句是一个定义拥有一个或者多个键值对的字典集合的简单语句。一个键值对是一个key和一个value的结合体。在字典字面语句中,每一个键值对的键和值都由冒号分割。这些键值对构成一个列表,其中这些键值对由方括号包含并且由逗号分割:
- [key 1: value 1, key 2: value 2, key 3: value 3]
下面的例子创建了一个存储国际机场名称的字典。在这个字典中键是三个字母的国际航空运输相关代码,值是机场名称:
- var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
airports字典被定义为一种Dictionary<String, String>,它意味着这个字典的键和值都是String类型。读取和修改字典我们可以通过字典的方法和属性来读取和修改字典,或者使用下标语法。和数组一样,我们可以通过字典的只读属性count来获取某个字典的数据项数量:
- println("The dictionary of airports contains \(airports.count) items.")
- // 打印 "The dictionary of airports contains 2 items."(这个字典有两个数据项)
我们也可以在字典中使用下标语法来添加新的数据项。可以使用一个合适类型的key作为下标索引,并且分配新的合适类型的值:
- airports["LHR"] = "London"
- // airports 字典现在有三个数据项
我们也可以使用下标语法来改变特定键对应的值:
- airports["LHR"] = "London Heathrow"
- // "LHR"对应的值 被改为 "London Heathrow
字典
For-In你可以使用 for-in 循环来遍历一个集合里面的所有元素,例如由数字表示的范围、数组中的元素、字符串中的字符。使用 for-in 遍历一个数组所有元素:
- let names = ["Anna", "Alex", "Brian", "Jack"]
- for name in names {
- println("Hello, \(name)!")
- }
- // Hello, Anna!
- // Hello, Alex!
- // Hello, Brian!
- // Hello, Jack!
For条件递增(for-condition-increment)除了 for-in 循环,Swift 提供使用条件判断和递增方法的标准C样式 for 循环:
- for var index = 0; index < 3; ++index {
- println("index is \(index)")
- }
- // index is 0
- // index is 1
- // index is 2
下面是一般情况下这种循环方式的格式:
- for initialization; condition; increment {
- statements
- }
函数
函数是执行特定任务的代码自包含块。通过给定一个函数名称标识它是什么,并在需要的时候使用该名称来调用函数以执行任务。
- func printAndCount(stringToPrint: String) -> Int {
- println(stringToPrint)
- return countElements(stringToPrint)
- }
- func printWithoutCounting(stringToPrint: String) {
- printAndCount(stringToPrint)
- }
- printAndCount("hello, world")
- // prints "hello, world" and returns a value of 12
- printWithoutCounting("hello, world")
- // prints "hello, world" but does not return a value
闭包
嵌套函数是一种在较复杂函数中方便进行命名和定义自包含代码模块的方式。 当然,有时候撰写小巧的没有完整定义和命名的类函数结构也是很有用处的,尤其是在处理一些函数并需要将另外一些函数作为该函数的参数时。下面的例子展示了之前 backwards 函数对应的闭包表达式版本的代码:
- reversed = sort(names, { (s1: String, s2: String) -> Bool in
- return s1 > s2
- })