简介
这是一个Swift语言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,会为你介绍Swift编程非常基础的内容。从电脑如何工作的全程基本原理到语言结构,你会足够了解这门语言,来处理数据和管理代码的行为。
快速链接
- 一个下午让你掌握Swift基础 ( 1/9 ) 编程本质 & Playground基础
- 一个下午让你掌握Swift基础 ( 2/9 ) 变量 & 常量
- 一个下午让你掌握Swift基础 ( 3/9 ) 数字类型 & 操作
- 一个下午让你掌握Swift基础 ( 4/9 ) 字符串
- 一个下午让你掌握Swift基础 ( 5/9 ) 做判断
- 一个下午让你掌握Swift基础 ( 6/9 ) 重复步骤
- 一个下午让你掌握Swift基础 ( 7/9 ) 函数
- 一个下午让你掌握Swift基础 ( 8/9 ) 闭包
- 一个下午让你掌握Swift基础 ( 9/9 ) 可选值
- Swift 初学者 ( 10/12 ) 数组
- Swift 初学者 ( 11/12 ) 字典
集合
集合(set)是没有顺序的相同类型唯一值的集合。当你想确保一个项目不会在集合里出现多次的时候,它会变得非常有用,并且项目的顺序并不重要。
例如,你想追踪游戏里还有哪些选手是活跃的,就可以用集合。
你对于这里选手的顺序并不感兴趣;你想让集合做的事是存储人并且并不允许他们在集合里出现两次。然后只需要问集合,“Alice 还在游戏里吗?”然后预期得到一个布尔型的 true / false。
如上图所示,没有索引或键可以用来取回值。你会在这篇文章里读到,你仍然可以遍历集合以及查询特定的值在不在集合里。
创建集合
你可以显示声明集合,通过写 Set 紧接着尖括号里加上类型:
let setOne: Set
Swift 也能从初始化的类型里推断集合的类型:
let setTwo = Set()
打印 setTwo,你会发现有趣的东西:
print(setTwo)
// > []
它显示了空的集合字面值和空数组的相同。
集合字面值
数组和集合不只是空的字面值相同。事实上,集合没有自己的字面值,用数组字面值来创建带有初始值的集合。看这个例子:
let someArray = [1, 2, 3, 1]
这是一个数组。那怎么用数组字面值创建集合呢?像这样:
let someSet: Set = [1, 2, 3, 1]
你需要显示声明变量为一个 Set。但是,感谢 Swift 的类型推断,你可以忽略集合包含的值类型:
let anotherSet: Set = [1, 2, 3, 1]
很明显,这是整数集合,所以不需要定义集合的类型。
要用行动看一下集合最重要的特色,让我们打印一下你刚刚创建的集合:
print(someSet)
// > [2, 3, 1]
首先,可以看到没有特定的顺序。其次,尽管你创建的集合带有两个实例值为 1,但这个值只出现了一次——记住,集合的值必须是唯一的。
访问元素
集合里的元素没有索引或键,所以你怎么知道集合到底有没有元素呢,以及怎么访问它拥有的任意元素?就像数组和字典,集合支持 count 和 isEmpty properties。
print(someSet.isEmpty)
// > false
print(someSet.count)
// > 3
可以使用 contains(_:) 来检查特定元素是否存在:
print(someSet.contains(1))
// > true
print(someSet.contains(4))
// > false
你也可以使用 first 和 last properties,返回集合里的一个元素。但是,因为集合没有顺序,你无法确切知道会获得哪个项目。尽管对于尺寸为 0 或 1 的集合,这会是一个获取单一集合元素的快捷方式。
print(someSet.first)
// > Optional(2)
就像预料的,frist 返回了可选值。它必须这样做因为集合可能是空的,在这种情况下 property 会返回 nil。
添加和移除元素
回到纸牌游戏。你想为明天规划一个游戏,希望选择一个对所有人对方便的时间。从建议你自己的适宜时间开始:
var myTimes: Set = ["8am", "9am", "10am"]
你把这个集合声明为变量,因为偏好可能会改变。例如,假设你决定上午 11 点也是开始游戏的耗时间,那就给集合添加另一个元素:
myTimes.insert("11am")
print(myTimes)
// > ["9am", "8am", "11am", "10am"]
insert(_:) 添加了元素到集合;如果元素已经存在,方法什么都不会做。
你意识到上午 8 点太早了。你可以像这样从集合里移除元素:
let removedElement = myTimes.remove("8am")
print(removedElement)
// > Optional("8am")
remove(_:) 返回被移除的元素,如果它在集合里的话,否则就是 nil。
迷你练习
写一个函数移除整数数组里的所有重复。数组?你想问这篇不是关于集合的吗?
小提示:数组有一个用 Set 类型的初始化,集合有一个用 Array 类型的初始化。
遍历集合
当你想遍历集合的元素的时候用 for-in 循环:
for element in myTimes {
print(element)
}
// > 9am
// > 11am
// > 10am
可以预料,结果没有预先设置的顺序。然而,这和你在其它集合类型里看到的 for-in 语法相似。
集合操作
集合最强大的特色之一就是他们支持集合操作(set operations),允许你把两个集合组成一个,创建只有两个或更多集合的共同值的集合。让我们用你的偏好时间集合来检测这些操作,以及另一组时间。
提醒一下,你提议了游戏时间为上午 9 点,10 点或 11 点。Adam 给你发送了他的偏好时间:
let adamTimes: Set = ["9am", "11am", "1pm"]
让我们依次看看集合操作的四个类型。
Union
union(_:) 创建新集合,带有两个集合所有的值:
let unionSet = myTimes.union(adamTimes)
print(unionSet)
// > ["9am", "11am", "10am", "1pm"]
主要要注意尽管你和 Adam 都选择了上午 9 点 和 上午 11 点为见面好时间,这些值在新集合只出现了一次。
这里,你留下了你和 Adam 提议的每个时间。
Intersect
intersect(_:) 创建新集合,只带有两个集合的共同值。你可以用它创建基于你和 Adam 同意的时间集合。
let intersectSet = myTimes.intersect(adamTimes)
print(intersectSet)
// > ["9am", "11am"]
这里,结果集合里的值就是在 myTimes 和 adamTimes 集合里同时出现的那些。
Subtract
subtract(_:) 创建新集合,移除在第二个集合里出现的值。
let subtractSet = myTimes.subtract(adamTimes)
print(subtractSet)
// > ["10am"]
从 myTimes 里的所有时间开始。然后 subtract(:_) 移除了 adamTimes 里出现的所有时间,留下只有你提议、Adam 没有提议的时间。
这个例子里,上午 10 点是唯一的你提议但没有被 Adam 也提议的时间。
Exclusive Or
exclusiveOr(_:) 创建新集合,带有只在一个集合出现的值,不包括同时具有的。
let exclusiveOrSet = myTimes.exclusiveOr(adamTimes)
print(exclusiveOrSet)
// > ["10am", "1pm"]
这些是你提议但 Adam 没有提议的开始时间,以及 Adam 提议而你没有的开始时间。
迷你练习
快速回答:你会用哪个集合操作来找到见面的合适时间?
集合操作的运行时间
集合和字典有非常相似的实现,他们也需要元素可以被哈希。所有操作的运行时间都和字典的那些相同。
关键点
- 集合(Sets)是相同类型的唯一值的无序集合。
- 集合在你需要知道一些东西是不是被包含在集合里的时候最有用处。
- 可以从数组初始化集合,反之亦然。
- 集合操作(Set operations)很强力,允许你处理潜在的大量数据来组合和过滤元素。
接下来去哪儿?
既然你现在已经学习了 Swift 里的三种集合类型,你应该很了解他们能做什么以及何时该使用它们。你在继续读教程的时候会看到出现。
现在你知道怎么把数组组合进数组、字典和集合里了,本教程的下一个部分涉及了命名类型(named types)。他们允许你同时组合数据和代码到一起,放到自定义的类型里,作为更大和更好的东西的建筑块!
移步之前,看看下面的挑战来测试你的集合知识。
挑战
挑战 A:你就是编译器
下列哪个为有效语句?
1. let set1: Set = [1]
2. let set2 = [1]
3. let set3 = Set()
对于接下来的三条语句,使用这个集合:
let set4: Set = [1, 2, 3]
4. set4[1]
5. set4.insert(1)
6. set4.contains(1)
对于接下来的两条语句,使用这个集合:
var set5: Set = [1, 2, 3]
7. set5.insert("1")
8. set5.remove(1)
挑战 B:检测集合包含的项目
假设你有 10,000 个人的邮箱地址集合:let emails: Set
挑战 C:追踪到场人数
你是 Swift 大学里的教授,在教一个为期三天的课程。每天,你追踪到场人数,通过到场的每个学生的名字到新的集合里。
例如:
let day1: Set = ["Anna", "Benny", "Charlie"]
let day2: Set = ["Anna", "Benny", "Danny"]
let day3: Set = ["Anna", "Danny", "Eric"]
- 写一个函数,返回三天都到了的学生的集合。
- 写一个函数判断谁在课程的第一天之后退出了。
这两个函数的结构为:
func funcName(day1: Set, day2: Set, day3: Set) ->Set
挑战和迷你练习源代码
https://yunpan.cn/cMQMgQ3itt7fy (提取码:6680)
介绍
欢迎来到Swift世界!Swift是一门苹果在2014年夏天发布的编程语言。从那之后,Swift发布了一个主要的版本跳跃,成为了开始在苹果平台:iOS,OS X,watchOS和tvOS开发的最简单的方式。
谁适合这篇教程
这篇教程适合懂一点编程、并且希望学习Swift的人。也许你已经为网站写过一些JavaScript代码,或者用Python写过一些简短的程序。这篇教程就是为你准备的!你会学习到编程的基本概念,同时也会成为Swift语言小能手。
如果你是赤裸裸的编程新手,这篇教程也是为你准备的!教程里贯穿有简短的锻炼和挑战来给你一些编程练习,同时测试你的知识。
需要准备什么
要看这篇教程,你需要准备如下的东西:
- 一台运行OS X El Captian(10.11)的Mac,带有最新发布的更新并且安装了安全补丁。这样你才能够安装需要的开发工具:最新版本的Xcode。
- Xcode 7.3 或更新的版本。Xcode是用Swift写代码的主要开发工具。最小也需要Xcode 7.3版本,因为那个版本包含Swift 2.2。你可以免费从Mac App Store下载Xcode的最新版本,这里:http://apple.co/1FLn51R。
如果你还没有安装Xcode最新版本,在继续看下面的教程前要确定安装。
如何使用这篇教程
每篇教程都会介绍触手可及的话题理论,伴随大量Swift代码来示范在学习的实际的应用程序。
教程里的所有代码都是平台中立的;这意味着不是为iOS、OS X或任何其它平台而特定。代码在playgrounds里运行,你在本篇中已经学习了。
在剩下的教程里,你可以把代码在自己的playground里输入进去。这样你就可以和代码“玩耍”(play around),做一些改变立即就能看见代码运行的结果。
剩下的教程里会贯穿实际小练习,都是简短的练习,关于触手可及的主题。每篇的末尾也有挑战,会有编程问题也会有长一点的代码练习来测试你的知识。做完就能掌握大部分的Swift基础知识。