>> [音乐播放]
>> DAN AMRMENDARIZ：每个人， 欢迎到CS50研讨会上，
iOS应用开发与斯威夫特。
我是丹Armendariz环，我就是一个导师 你们是哈佛计算机科学。
>> 而接下来的一个小时将是 尽可能多的东西旋风之旅
关于这个话题，因为我们能适应。
我将发布所有的源代码 你会今天在网上看到的。
我们可能不能够 其实去了一切
我是说我 显示你在这个时候。
但至少希望通过 的源代码的注释，
你就可以揣摩什么 究竟发生了那些事
我们不太去。
>> 的整体，该结构 今天的演讲将是如下。
我们将开始做了一些基本的 语法与雨燕的语言，
进入一些更高级 雨燕语言的语法。
由于语言 真的是现代，它
有很多高水平 功能事情，我们还没有
整个CS50见于C，或 甚至一些其他语言
我们已经开始 使用CS50，如PHP，
所以我将不得不尝试 还介绍了一些主题，
相关的高级语言 你可能不深入看到CS50，
但你会在后面看到的 计算机科学课程。
因此，这将是一个 紧凑小时。
请随时让我 知道，如果你有任何问题。
所以，如果你有兴趣 在做开发
与雨燕，还是真的 任何iOS应用的开发，
有一对夫妇的要求。
首先，你必须要使用 在Mac上，在实例运行
我们将要使用的今天， 操作系统版本比较新
十，在这种情况下，我跑X 10.5。
您可以在运行10.11，如果你想要的。
但一切，你要去 看到的是，涉及的Xcode 7及更高版本，
它具有最新的版本 斯威夫特，这也是雨燕2.0​​。
这其实是一个相当 重要区别。
很多语法有 漂亮显著改变
在某些情况下，从夫特1.0， 这是去年发布的，
以雨燕2.0​​，这 刚出来的时候，今年秋天。
所以，我们要展现雨燕2.0​​。
很多的东西， 你搜索在线
当你试图获得更多的 关于各种事物的信息，
你可能想明确地 搜索斯威夫特2
而不是只是普通的老斯威夫特使 确保你得到正确的语法。
>> 事实上，这通常是真实的。
有较快的发展量 发生在雨燕语言
自从苹果公司发布了它，我觉得 是什么，它​​是一个一年多一点
现在。
而一切都变了 急剧那个时间。
所以，不要感到沮丧 如果，当你环顾四周
对雨燕或主题如何完成 一些使用一些示例代码
或东西，它不 在雨燕2.0​​的实际工作。
请确保你正在寻找 针对该版本
以尽量减少不同的效果 版本和那些各种各样的事情。
>> 我会尝试指出只是一些事情 这是不同的旧版本。
但是，这件事情要注意。
这可能将是 最令人头痛的一个
你将与​​雨燕是寻找 示例代码是旧的，甚至只是
通过几个月，欲以 它在你的更现代的项目。
它只是根本不起作用。
你得到编译器错误，语法 错误，各种疯狂的东西。
因此，只要有耐心 这一点，你会希望
有一个相当不错的体验 与雨燕的整体。
>> 现在，您可以真正join--，我希望 我们其实还是有这本year--
CS 50的苹果应用程序 开发团队，
将允许你安装任何应用程序 您在您的iOS设备上创建。
因此，看看这个网址，如果 你有兴趣这样做。
>> 所以，只是一对夫妇的 东西约雨燕本身。
它是编译型语言。
但你会看到一些 那我们使用的功能
允许它也用于比特 像一个解释的方式为好。
>> 很多语法是借来的 从C.它是基于并写入C.
因此，我们会看到， 有很多外卖的
从现有的知识 从C，我们可以移植到斯威夫特。
>> 但有些事情 让它从C很大的不同
这是非常强类型。
有自动内存管理。
你不会有 用malloc或免费的任何地方。
它是专为通用性。
所以，换句话说，你可以用它 种种情境，从Apple关注
到iPhone一路攀升到OS X，和 甚至有些服务器，甚至一些脚本。
但是，我们会看到， 支持脚本
是还没有应用的 这是在其他语言。
因此，最有可能你会使用 这个专为开发
在你的Mac或iPhone。
>> 而且它有很多的现代特色。
和很多这些东西的东西， 我们要试着今天在这里讲话，
但坦率地说也是我们的主题， 我们可以投入全部课程。
事实上，CS 51，这是 提供下学期，
集中了大量有关这些主题 这说明如下。
所以，你可以花一整个学期 了解这些东西。
但是，我们要尝试 打通他们
至少够你 可以理解的
外出时你看看 在斯威夫特程序
并能够破解你的方式 通过它进行最后的项目。
>> 现在的最佳方法之一，你可以 获取更多相关信息
坦率地说只是通过苹果 为雨燕提供的文档。
有很多的API 可用。
这是一个很好的大本营您 寻找，具体的事情你
想与涉及的iOS的API。
如果你想使用相机 例如，你可以开始寻找在这里，
，还可以使用谷歌和堆栈 溢出，你通常会。
>> 在此有任何疑问 之前，我们在正确的跳？
好吧。
让我们继续。
>> 因此，首先，我有一个 的示例文件数量。
我要去尝试步骤 通过他们比较快。
这是世界您好文件斯威夫特。
这很简单。
有办法更多评论 不是有实际的代码。
请注意实际的代码是在 最底层的14行。
它说，打印。
然后它是一个函数调用。
我们正在传递到它 字符串名为Hello CS50。
请注意，有没有分号。
请注意，没有INT为主。
有没有一个 克鲁夫特，我们曾与C.
当我们以这种方式使用SWIFT， 这仅仅是写在一个文本文件
并存储在我的电脑上，然后 我可以编译并运行它。
>> 请注意，在这里我 不使用CS50 IDE。
这是假设我 运行，并且我在OS X中，
而且我已经安装的Xcode 本机为了使该上
实际功能。
但是，这仅仅是一个普通的文本文件 我们就可以编译和编辑。
所以，让我们来看看这实际上是如何工作的。
如果我想编译它？
swiftc 1.swift。
经过一个或两个时刻， 可以看到，我们现在有
编译成一个名为1的文件这一点。
现在我们已经印制了CS50， 我们的Hello World应用程序相当。
>> 注意一件事是 还有的是，在默认情况下，
我们没有输入 A / N打印新的生产线。
默认情况下，在打印功能 斯威夫特将打印新的生产线为您服务。
您可以通过可选的附加 参数来告诉它不这样做。
但谷歌关于它的更多信息。
默认情况下，它会做的打印线。
>> 好吧，让我们继续前进 然后向一些其他的事情。
那么怎样才能真正定义变量？
我们可以做使用的 一个两种方法。
而我要的人告诉你 关于第一个是这让定义。
这一点很重要 因为有效
我们正在做的事情是定义一个常数。
我们将创建一个变量， 或者更确切地说，一个恒定的叫名字，
提供给它的一些数据 - 这种情况下，串丹。
但是，通过使用这让 关键字，我们说
这个变量 - 或 再次constant--称为
名字是永远不会改变。
这将在整个是不可变的 这一计划的持续时间
或在整个 上下文的持续时间
即该变量是可用的。
>> 这是非常重要的，当 你有一些数据，是不是
要在你的程序改变， 你会看到各种各样的例子
什么时候我们要使用 让相对于其它语法，
您使用让它非常重要 只要有可能，因为这将通知
它是语言 不会改变，
和它实际上可以执行 很多优化工作
提高速度和 你的程序的安全性。
而到安全，我的意思是不能让 疯狂的错误，它崩溃
我们可能会 见惯了在C.
>> 然后我们可以使用字符串插值 要在字符串中封装此。
因此，我们可以在此看到 打印线，打印你好，
然后用反斜杠开括号， 然后我的变量的名称，
在这种情况下恒定， 关闭括号。
我本质上再敷上 这个变量叫名字的内容
内的字符串，然后 印刷有结果。
>> 还有另一个改变这个文件 这就是我，在最高层，
放在一个家当线， 基本上只是规定
我想使用 斯威夫特解释器，
意味着我不再有 编译这个特定的程序。
我可以运行它像它自己的脚本。
但是，这是，在这种情况下，后面 该场景被编译，然后
正在运行。
这只是看不见我们。
>> 好吧，让我们继续前进。
所以这是一个有点挂羊头卖狗肉 刚刚发生过。
我给你我 可以定义一个常数。
我可以提供一些数据来做到这一点。
但在这种情况下，请注意，我没有 实际上指定数据的类型
这是。
这是因为 编译器，雨燕能
推断只是基于数据的类型 对，我把它放在数据。
因为它知道，通过评估该 变量就在这里，这个数据正确
这里，它知道它是一个字符串。
所以这个常数的名字因此 将是一个字符串，以及。
>> 但是，我们也可以明确 关于这类型
我们将用于 常数或变量
通过使用此语法instead-- 让名冒号字符串等于
丹，在这种情况下意味着我们 要定义常量叫名字。
这将是String类型。
并且该值将是丹。
现在其他的方式 我们可以创建variables--
而这些都是可变变量，这 意味着我们，事实上，将
某个时候改变自己的内容 在上下文的持续时间
即该变量defined--我们 使用var关键字，而不是让。
但同样，在默认情况下，除非你知道 你需要处理的数据，
尝试使用我们的 性能改进。
>> 在这种情况下，我可以再 指定的数据的类型
我们期望得到的内部 这家名为标签的新变量。
这将是一个字符串。
而我们要那么串联 两个字符串，字符串Hello，
和字符串所代表 变量，或者更确切地说，常量名。
>> 因此，这是很好的，因为这 是有点像PHP的，因为我们
有非常简单的字符串连接。
我们不必以自动 使用任何类型的内存管理
以增加的大小和做 任何形式的有趣的事情出现。
这个工程，因为我们实际上期望。
>> 好吧，这个问题吗？
>> 现在其他的原因， 我们需要你有足够的能力
能够定义什么 数据变量的类型是
是因为有时候我们不 要初始化变量
以在一些数据 点的定义。
因此，在这种情况下，让我们说 我要开始输入
部分牌号为一年级的书。
嗯，我知道了一个 我想成为变量
将是一个可变的档次。
我们也知道，我们 希望它是一个整数。
但也许我们还不 有级可用。
>> 在斯威夫特，你必须 定义数据的类型
是与一个相关联的 变量或常量让
之前，你其实可以 使用该变量。
因为它是强类型， 你有一个类型关联
这些变量。
>> 因此，在这种情况下，如果我没有正确 初始化先用一定的价值，
那么我要告诉斯威夫特什么 我期望得到的数据类型。
而且它会继续保持 相同的数据类型
整个项目的历史。
>> 现在，你可能会尽快诱惑 我创造了这个级别的变量
并提供了它的一个 如果我的100的整数，现在
想尝试来连接 一个字符串，该整数，
也许会仍然使用 该字符串连接运算符
像我们以前那样，只需几行。
但不幸的是， 这实际上不是
工作，因为你是 本质上表演
上两种不同类型的操作。
>> 现在，这是其他非常不同 语言如PHP这是真的
loosey鹅与他们的那种类型。
他们只是想，是啊， 什么，我不在乎。
只要给我一个类型， 也许我会做正确的事。
>> 在这种情况下，雨燕 极为严格的有关类型
你正在处理。
这求和运算符 或连接运算符
基本上具有几个 不同的可行方案。
你可以做总和 与整数，或者你
可以做字符串连接，并 也许一些其他的事情也是如此。
但如果运营商不承认 什么是在它的两侧
或者更确切地说，这些的组合 两种类型，是不是它的预期，
然后它会导致失败。
>> 因此，在这种情况下，这是什么意思 以有一个字符串加上整数？
孔中的上下文 这一点，我们可能需要
做字符串连接操作。
但当然计算机 没有那种背景。
因此，我们需要提供 该附加信息
让它知道这是什么 就是我们想要做的。
>> 因此，换句话说，事实 该斯威夫特是强类型
意味着你必须做 额外工作一点
得到它来操作 你想办法。
但是，结果，它是安全。
一旦你有拿 考虑到这些类型，
事情就坦言启动 工作得很好。
>> 所以在这种情况下，我们将然后 执行字符串连接
通过明确铸造 整数为字符串
通过包装它在这 大写字母S字符串函数，
然后使用字符串连接 运营商来修改我们的标签变量，
然后打印出来。
>> 到目前为止，一切都很好？
好吧，让我们继续前进。
>> 现在有各种数据 类型，我们可以在斯威夫特使用。
当你已经习惯了， 我们可以创建一个可变的数组。
而这阵只能 含有单一类型。
>> 因此，在这种情况下，我们要创建 一个整数的可变数组，
我们将调用档次，我们将能够 存储在这个方括号
格式你已经长大习惯 在多种其它语言的。
但是请注意，在这里我们是 确定几件事情。
成绩是一个可变的变量 - 我们不使用let关键字。
因此，这意味着我们可以修改 这个数组的内容。
这是数组类型为int， 我们可以告诉大家，
基于这些方括号这里。
>> 现在，人们的好东西 这个是我们
有机会获得大量的 附加信息
有关阵列只使用 一些简单的点表示法。
因此，例如， grades.count提供给我们
项目中存在的数 数组，我们就可以访问漂亮
轻松简单的使用点符号。
>> 如果要添加其他 项目这个数组，
你不能这样做PHP的风格 在这里你只要明确定义，
一个给定的索引处，一些价值 要插入。
相反，使用append 在数组类型的方法
追加该项目，95，到这个列表。
>> 所以，现在这个数组具有以下 contents-- 100，0，90，85。
现在，我们已经追加 95到这一点。
>> 还有其他的方法 我们可以附加的东西。
实际上，你可以使用 求和运算符，
这将被解释为 数组追加操作。
你也可以再追加另 阵列，其内容是70和80，
该阵列。
所以，现在我们有 在这个变量的内容
grades-- 100，0，90，85，95，70，和80。
这仅仅是一个不错的语法 糖是斯威夫特提供给我们。
>> 因此，如果我们想求和 成绩，我们也许
会想迭代 在这个循环的每个项目。
同时，我们也有，在斯威夫特，概念 for循环，你会期望。
但是，我们要说明的方式 一个范围略有不同。
所以在这种情况下，到 总之一切，我们将
要创建一个临时的 变量称为总和，以便我们
保持这个数量。
>> 并注意我们的 这里环路建设。
对于指数在0 ... <grade.count。
所以该结构，0 .. <grades.count 是一系列的操作我们在哪里
他说，我们要创建 从0整数范围
但不包括grades.count。
因此，这将是0，1，2，3，4， 5，直到然而，许多1
前grades.count。
>> 因此，这是不是有什么不同，我们 将通常用于循环
你会在那里有一些指标 变量，将其设置为0在第一，
然后集成的，直到一些 值小于项的计
该数组。
>> 因此，有一个修改 这一点，其实，
这使我们能够很容易 设置不同类型的范围。
如果您更改此范围内 三个点，0 ... grade.count，
这代表范围为0 到grades.count包容性，
这意味着该号码也 然后包含在该范围内。
>> 但是，这是非常方便的 对于这些具体的事情，
当我们要进行 在迭代循环
因为这些指标都是零索引， 正如我们所看到的其他语言
为好。
在此有任何疑问for循环？
>> 因此，有隐含的定义 该指数的变量，
其值从0开始，并 继续在每个循环迭代
1至增加，直到点 等于grades.count，
在这一点，循环中止。
>> 请注意，在我们的字符串 内插在这里，
我们实际上可以执行一些简单的 操纵这些值。
因此，指数加1将实际 执行该值的总和
由于指数是在 这种情况下，一个整数。
在这一点上，它将 然后被转换成一个串
插值成该字符串在这里， 并打印出来，因为我们所期望的。 。
>> 而好处 关于阵列这里
我们也能有 取值和设定值
用方括号作为 我们已经看到在其他语言。
>> 所有的权利，所以从这里，我们现在 我们计算所有等级的总和。
现在的排序下一个 合乎逻辑的步骤将是
做除法运算找到 从这些成绩的平均值。
但是，一些重要的东西 这里正在发生哪些
是，这笔钱也许是一个整数。
但是，我们需要执行一些 那种双师。
而这将是 非常重要的，当
我们要执行此操作， 因为我们在说什么
是我们需要真正 在两个双打进行划分。
再次，由于斯威夫特 非常强类型，
我们必须明确地设置所有的 其实在我们的项目双打
执行该操作。
>> 因此，为了让我们 执行双师，
这是不够的只是一个 这些项目是一个双。
他们都必须是 双重为了迅速
可以肯定，这 就是我们想要做的。
因此，我们会再明确类型转换 而我们上面计算的总和
和档次双打的数量，和 然后执行该操作和存储
这到这个新的变量，或者更确切地说， 这个新常数叫平均，
这将有什么类型的，你能想象吗？
双，是啊。
所以在这种情况下，我们 不必指定它
因为它可以从被推断 操作什么样的数据平均类型
会是。
而雨燕一般是相当不错的 对能够推断出的类型。
>> 难道你想看到这个 运行，或者我可以继续前进？
我想继续下去。
在任何这有问题吗？
大。
>> 现在我们要开始去 好stuff--定义功能，
和一对夫妇的其他类型是 独特的雨燕，你有没有
看到其他语言 直到这一点，
但它们存在于其它 语言，你可能会发现以后。
因此，首先，如果你想 定义一个函数，
你用时髦的词定义它 函数，然后函数名，
然后在括号中的参数 您希望这个函数接受。
这些参数也必须 specify-- generally--
还必须指定数据的类型是 它们是，除非它们可以推断。
我们会看到那个小 需要注意的只是一点点。
>> 因此，在这种情况下，我们有一个 函数调用printGradeCount。
我们将接受 变量 - 或者更确切地说，在这种情况下，
一个constant--叫成绩册。
而这将是对 键入整数数组。
现在有什么东西 这是非常重要的在这里
我希望你能理解。
也就是说，默认情况下，这些参数 输入时该功能的
有一个隐含的let关键字定义， 这意味着我不能修改这个
在这里成绩簿变量。
而排序是有道理的， 因为你传递的数据研究。
你也许不希望它 从下你变了。
它可以明确地提 这是一个变量通过将
这里var关键字。
但是，这是我们已经一个疑难杂症 人们注意到，在过去做
是，他们以为这是怎么回事 是变量时，事实上，它
是一个常数。
>> 好了，所以在这里的话，在这种情况下， 我们没有指定任何返回类型。
我们会告诉你怎么做 在短短的时刻。
但是请注意，在这里，我们有 只是一个简单的，如果条件。
如果成绩簿是 空，在这种情况下
是这个整数的只是财产 阵列，那么我们打印出一些东西。
否则，我们做别的事情。
>> 很简单，到目前为止，我认为。
但是，如果你有任何问题，阻止我。
>> 现在这个功能，平均，也需要 一些参数，或者说一个参数，
这是成绩册，而这一次 是否会返回一个double类型。
因为它是计算 的平均值和它的
要真正返回 计算出的平均呼叫线路。
>> 在这种情况下，我们指定 箭头后返回类型。
而这可能会感到 那种怪异的在第一。
你已经习以为常 于设置返回
函数的名称前输入。
但是，如果你觉得这 在数学方面，
就像当你有数学 定义一个函数，
你有一些功能 输入，它产生一个输出。
而这正是 这是应该模仿。
还有一对夫妇其他语言 具有类似的语法为好，
但可能没有一个 你见过在CS50。
但还是不要被它迷惑。
箭头表示是怎么回事 在这种情况下，要返回。
好了，我们怎么 计算这个平均值？
好吧，如果成绩簿 是空的，好，那么我们
会返回一个0，这可能 一个合理的方式来对待这一点。
我不知道，让我们来 回到那个在一点点。
这可能不是实际 是一种合理的方式
计算的平均如果 我们有一个空的成绩册。
>> 然后，我们就进行了总结。
请注意，在这里我们实际上 有一个替代版本
for循环，这使我们能够迭代 在数组中的每一个项目
并把每一个元素 到它自己的变量。
通过在指定的等级 成绩册，我们在说什么
就是我们要含蓄 创建一个新的常数称为
等级，是要代表 在成绩簿每一个独特的项目
每一次的for循环迭代。
所以第一次 它的运行，成绩将
在成绩簿中的第一项。
第二次，它会是 第二个项目，等等等等
直到成绩册有 用尽元素本身。
然后，我们就可以总结说 等级到我们的总和变数
并返回我们的平均 正如我们之前看到的。
OK，什么问题吗？
是？
听众：我有两个问题。
第一，假设，可以 你在这一个运行的整数？
不必须是一个 双，是正确的？
DAN AMRMENDARIZ：你能 重复这个问题？
听众：我可以这样做 整数作为平均？
DAN AMRMENDARIZ：你能 做整数作为平均？
因此，返回一个整数 平均而不是双？
>> 听众：Return--您 有这个权利，现在下面。
DAN AMRMENDARIZ：就在这里，返回0.0？
听众：是啊，刚刚返回0。
所以这将是要么 80或85，但不是85.2。
>> DAN AMRMENDARIZ：所以在这种情况下， 所以有几种不同的方法
要回答这个问题。
我来回答他们的订单。
所以，如果我只是让这个返回 0，0是一个整数值。
因此，这将导致一个 型误差对于这种情况
因为它期待一个双 但随后返回一个整数。
如果我想返回一个整数，我可以。
我可以设置的返回类型 为int，这里返回0，
而不是执行双师。
但是，我们将 做整数除法。
所以我们以后就不会得到 一般，我们将可能期望。
但是，是的，我们可以通过修改 以这种方式的类型。
>> 听众：其次，你 有一个双顶部。
但向下跌破，当你 做回双人大床，
这已经自动 返回双格式。
为什么你还需要将它定义 在顶部有一个双箭头？
>> DAN AMRMENDARIZ：所以 在情况下，这是部分
对the--如此重复的问题， 因为这是自回归隐
这里的类型，什么类型的这实际上 是，我们需要明确与斯威夫特
什么，我们要 返回该功能的出
这样，当它执行类型 检查时，可确保
这就是我们实际上写 楼下居然符合这一点。
因此，这有点像检查 与自己的排序情况。
但是，are--
>> 听众：[听不清]箭头？
>> DAN AMRMENDARIZ：有情况下，当 我们可以指定我们可以隐
设置返回类型。
但在这种情况下，我不 认为这工作。
还有一些其他的语法 以后我们会看到。
>> 好了，所以这个来源 代码是有点不同
因为这种分析的参数 我们正在调用该函数。
让我告诉你它是如何工作 之前，我们实际上前进
一些有趣的事情 这是发生在斯威夫特。
>> 因此，在这种情况下，如果我只是运行此 代码，请注意，它是做什么
is--而种，它 给了我一个奇怪的错误。
我需要通过这几个 整数作为命令行参数。
因此，让我们来看看，150和80，然后按Enter 找出它实际上做。
它接受各 这些数值为整数。
它的输入他们入成绩册。
然后，它执行 该平均值计算
并输出，作为我们期望的那样。
>> 不过，显然有什么东西会 与此拒绝的东西
东西作为一个整数。
正如你可能还记得，当我们 处理命令行参数
在C和其他语言，第一个 在命令行参数0个项目
列表是命令的名称 我们实际执行。
因此，在这种情况下，我只是循环 在所有的命令行参数。
但我没有做任何形式的花哨 检查跳过的第一个。
我只是或明或我隐 检查这些类型的
是整数之前，我其实 执行此计算。
>> 这就是本质 这里发生了什么。
对于每一个参数 该过程的参数，
我要进行一些检查。
在这种情况下，我要去 试着先转换
这样的说法成整数由 执行明确的类型转换，
因为它是，在输入一个字符串 并没有实际上的整数。
>> 但是，这是怎样的一个奇怪的语法， 如果让坡度等于INT（参数）。
实际发生的事情 这里是非常
重要的是你用斯威夫特。
这是用什么 所谓的可选类型。
>> 所以这个功能，INT（参数）， 返回不只是一个整数，但返回
什么所谓的可选整数。
所以这是有点 一个类型上的类型的顶部。
那种你能想象它像 它的返回像包。
而当你打开 封装，无论是
具有整数，这是结果，或 它具有绝对没有在它。
而这是作为一个错误检查有用 机构，因为在这种情况
我们可以看出，这是 类型转换成功？
如果是，那么它是实际上 将不得不内的整数。
否则，这将有一些 值，我们称之为零，这
代表没有整数可言。
这是真正代表什么。
>> 所以这一点，如果建 使我们能够解开那个包，
那个可选择绑定。
如果我们能够解开这 打包并发现里面的整数，
然后我们在说什么 这里要说的是，我们之后会
允许设置该值成 这个常数称为档次。
和if语句的这一部分， if语句的顶部部分
将运行，因为那 展开是成功的。
>> 如果它只是恰巧， 有可能是一个错误
在这种显式类型转换 从字符串的整数，也许
它的值ABC为例。
而这实际上是不打算 转换成整数。
然后，它会返回nil， 这不是一个整数。
而这个if语句以及再失败。
成绩将不会因为存在 它没有任何整数内容。
它将运行这个else块来代替。
是？
>> 听众：无为N-I-L？
DAN AMRMENDARIZ：无为N-I-L，是的。
>> 因此，这是可能之一 关于SWIFT最难的事情，
尤其是当你在 在iOS应用程序的杂草
而你实际上是试图 做一些开发那里。
这将是大呼小叫 你对可选的。
这将要求你的 问号和惊叹号。
但是，一旦你的身影out--，如果你 花一些时间来搞清楚
什么是可选的种类回事， 你会节省大量的头痛
当你试图 写在斯威夫特的应用程序。
>> 它实际上是一个非常强大的功能。
而你只需要 把我的话它现在。
但是，我们会看到这种结构 有的人喜欢它
在其他一些源代码 我们会告诉你的只是一点点。
>> 是否有任何初始的问题在这里？
因此，重要的外卖是一个 可选的类型是那种一元类型的。
它或者具有值， 如果确实如此，那么它
也许会有关联的值 有了它，或者任何有没有价值，
它是由零来表示。
这剩下的也许是 正如你所期望的。
>> 因此，让我们斜坡上升 困难再一次。
而这个时候，让我们来看看一些 实际存在的其他数据类型。
其中之一是词典，它是 非常类似于Python字典。
这有点类似于在哈希表中 C.它实质上是键的映射
其中，键可以是字符串。
而当你仰望这些键， 这些密钥将有一个值。
所以它不是很数组，但 相反，联系更紧密
一个散列映射或哈希表。
>> 让我们来看看这是怎么认为 我们以前的工作实际
进入源代码本身。
如果我只是运行它， 没有什么发生。
它告诉我，我期待 以下类型的一些参数。
所以，我要提供给 它的一些问题集的名字，
所以pset0，也许我得了100。
而PSET1，我得到了5。
然后在考试，我 确实非常好，得到了30。
而哎呀，我在这里打了一个空间。
>> 当我敲回车，就可以看到 它执行一些计算。
它说，成绩册为三 等级，PSET1，pset0，考试。
而成绩簿有 这个特定的平均水平。
所以，再一次，我们正在努力 这一成绩册的想法，
但我们要继续迭代 与我们的功能的复杂性。
>> 因此，在一开始，我们只是 要创建一个函数，
负责印刷的用法。
还有的这一退出 功能，将只
强制退出应用程序。
这是不是一件 你会在iOS应用使用。
这是唯一的，在这种情况下， 用命令行参数。
接下来，我们将开始走向Xcode中。
但是，这是具体的命令 线型方案斯威夫特。
>> 让我们来看看一些 这里的有趣的事情。
让我们来看看，只有一对夫妇的 有趣的事情提也许
是，我的功能 印刷等级的数目，
你可能还记得，我有这样的列表 的items-- PSET1，pset0和考试。
实际上，你可以迅速 轻松地做到这一点
通过采取成绩簿，这是一个 字典具有键和值。
找到所有的关键就是通过 这里的关键点的方法，
然后用这个joinWithSeparator， 它随后将采取所有的关键
我们已经输入了，pset1--或 抱歉，pset0，PSET1和exam--
并连接在一起 使用逗号和空格
创建一个长字符串。
这种连接操作仅仅是惊人 有用在各种情况下。
因此，这是这个joinWithSeparator。
>> 这是一件事是 改变从斯威夫特1斯威夫特2。
过去有一个 如果你的Python style--
熟悉Python--一个Python 风格的加入对字符串的方法。
但是，这已不再是 在斯威夫特2的情况。
你想，如果你想用这个 来连接东西的数组
连同一个字符串。
>> 因此，也许那么在我们 平均前讨论，
它使一点点意义 为我们设定的平均功能
是任选的，而双 不仅仅是一个明确的两倍。
因为我们有这样的 不寻常的情况，其中，
如果实际成绩册什么 已经在它没有价值？
又该平均回报？
>> 嗯，也许在C中你 会做什么
等提供的标记值，如 0.0，或者负数，
什么刚表示事实 说明有一些错误条件
你也许实际上并不 计算该平均的能力。
那么指定的美丽 可选的类型会做到这一点。
而我现在说这些话，但 这其实不使用选配。
但是，我们可以看到，在刚刚 分钟，在这里我们可以设置平均
为使一个可选的数据类型 如果它实际上返回一些数据，然后
我们将返回的数据。
否则，我们将返回 零，说这
没有有意义的计算。
>> 让我们转移到别的东西。
所以从这里开始，我们一直在寻找 所有这些例子中的命令行。
不过说真的，你打算什么 待处理的Xcode的。
而关于漂亮的事情之一 Xcode是，特别是在雨燕，
是，我们有这个 东西叫做一个游乐场。
和一个操场是 不是在所有的iOS应用程序。
但它可以让你体验 与Swift在一个非常简单的方法。
您可以输入所有的代码。
它很好的语法高亮显示在这里。
当你创建一个新的文件，它会询问 你，如果你想创建一个游乐场。
但对游乐场的好处 是在你的窗口的右侧，
它实际上告诉你 从您的代码的输出。
所以，如果我向下滚动，我们可以看到什么 各个行的代码的输出
实际情况是。
>> 因此，在这种情况下，我们要 改变方向，只是一点点
与谈这真的 重要的是这种高层次的方法
该夫特操作，并且它 这种想法倒闭。
你可能已经看到了这一点 在JavaScript中一点点。
对于那些你 在CS50，封闭
在做非常受欢迎，非常好的方法 高层次的东西在现代语言。
但它也是一种很难 包装你的头左右的第一次。
所以，如果你在看这个 第一次，没关系。
只要看看源代码，看看 如果你自己看着办吧在家里。
>> 因此，在这种情况下，让我们说，我们 要创造了许多代表人物
与一些固定值。
因此，在这种情况下，我可以创造一个功能。
我打算把它的力量 在生活中2，其唯一目的
是采取一些输入和双 它，并返回该值。
请注意，我在这里 接受一种类型的数据。
这将是一个变量x。
这是Double类型。
我还会回到这里一个双。
而我只是打算做 很坦率地说，漂亮
加倍这个数值的幼稚方式。
我会告诉你为什么 是在短短的第二个有用。
>> 请注意，在这里，我们有这个范围内 再次。的东西在1点
点点，2，这意味着 这种循环将运行两次。
但是，这代表了一个虚拟变量。
这意味着我不是真的要 在任何地方使用该变量
在这个循环中。
我只是希望这条线 的代码运行两次，
无需知道 该范围的值。
>> 因此，在这种情况下，我运行的结果 次两次x，它本质
意味着我现蕾此值。
而这恰好 工作作为我们期望的那样。
2的幂，传递的价值 2.0给我们4的输出。
3.2工程10.24。
>> 现在，我们可以做一个类似的 对于3次方的事情。
但现在只更改范围。
对于1哑变量 通过3，乘3次，
做同样的事情。
>> 因此，这可能会觉得有点做作。
但是，还有一个重要的 这里的东西
是看着这些 两种功能，有
只有一件事是不同的， 这是在范围此值。
一切有关这两个 功能的3次方和2的幂，
是，其实是因为相同的 它们以同样的方式工作。
>> 所以在这一点上，一个小 警钟应该去了。
希望你在说什么， 要知道，这种感觉有点
喜欢重复劳动。
也许有一种方法，我会 能够封装所有的这
并提供一个功能 或者创建一个函数，
不正是我想要不 需要给它明确地打字了。
这是什么力量 一个封闭的让我们做。
因此，让我们来看看这个。
我会花几个 分钟在此，因为这
对于斯威夫特非常重要的。
我们看到这一切的时候。
我们要定义一个函数。
这将被称为powerOf。
这将接受 参数调用类型为int年。
但看一看的返回类型。
返回类型是，在 括号，双箭头双。
这意味着这种功能， 这个功能powerOf，
正在恢复的功能。
这是接受双 并返回一个双。
所以这听起来疯狂的那种， 但让我们向下滚动一点点
看看，看看会发生什么。
我们这个功能powerOf内。
我们正在创造一个新的功能 所谓的求幂，
但不要紧它是什么。
>> 请注意，这有 x的输入值。
而且它正在一个双 并返回一个双。
这是相同的代码，我们 看了上面的，不同的是2的值
的3或值，即 上限在该范围内，
已被替换 此值y，该
为初始参数 我们powerOf功能。
并在这一点上，我们 返回求幂。
我们返回的功能。
>> 这有点像一个小令人兴奋。
但让我们想象一下 当我调用这个函数powerOf
并传递到它的一些价值如2。
这意味着的是， 现在，我的价值
2 y的，这意味着，这个值 y在这个求幂函数
的值将是2。
但是我回到这个 求幂函数。
>> 所以注意什么斯威夫特说我 在这种情况下，已经创建。
让广场上的定义，它是 可以接受双击功能
并返回一个double。
我创建了一个功能 该广场的东西
使用这种机制就在这里。
而真正发生的事情是 它返回该功能
求幂，但这个值 Ÿ被包裹在它的内部。
所以现在每次我用这个 变量或常量这个叫
广场，这是怎么回事 表现为一个函数。
所以我可以调用这个变量 就像我会调用一个函数，
并传递到它的一些， 像在这种情况下，3。
我会再平方此值。
因此，3平方然后将 成为9，因为我们可以在这里看到。
>> 但现在真的疯了， 让我有机会
创建其他powerOf功能。
就像我可以说，好，现在我想 创建一个新的功能，powerOf（3），
并存储到一个 常称为多维数据集。
现在，多维数据集将是一个 独立的功能，将随后
需要一定的值作为输入和多维数据集 价值，我们可以在底线见
这里。
2立方体将会导致8。
>> 希望整齐漂亮的东西。
你以前从来没有见过这个。
我鼓励你寻找到关闭 并调查这多一点点。
它真正强大的东西，我们看到了很多 在JavaScript和其他语言。
这是真正重要的 理解的API以及
我们会得到，在短短一秒钟。
是？
>> 听众：当你做 powerOf（2）中，括号，然后
另一个括号，另一个input-- 你基本上取代了广场。
DAN AMRMENDARIZ：所以看 在这里的最后一行。
它实际上是完全可能的 做链接如你所说。
所以powerOf（5）意味着我们要去 以具有5的求幂在这里。
因此，这基本上将是 同样的事情，4到第五电源，
因为我们已经创建了一个指数 传播到第五功率，
我们正在传递到 该功能的值4。
而我们得到的价值 我们预计，1024。
听众：它不是一个 名字，所以它可以更容易
阅读，广场等等。
>> DAN AMRMENDARIZ：对，没错。
所以，之前我只是把它 为恒定在这里，所以
它可以轻松使用该名称。
是？
>> 听众：在这方面 powerOf，它的一部分
编程语言的 相对于这样你
想powerOf在[听不清]？
DAN AMRMENDARIZ：所以 在这种情况下，powerOf
是的简单的名称 我这里定义了功能。
因此，它不是与生俱来 语言本身，
但相反，它只是 一个函数具有
这个名字是因为我给它的名字。
其他问题吗？
好吧。
>> 现在，这是伟大的。
但你不会看到一个 很多倒闭的功能，
都是这样的，你定义，里面 的一个功能，另一个函数。
你可以做到这一点。
但它是一种不 真的有必要，对不对？
就像为什么我定义这个 函数调用求幂
然后立即返回。
为什么我不能只是马上 回到这个功能吗？
>> 而事实上，这正是 背后一个概念的想法称为
匿名函数，其中， 匿名函数实际上并不
有，因为它们的名称 不需要有一个。
因此在这种情况下，在图7B中， 我们可以发现正是。
这一切都相同的代码， 不完全一样的东西，
但现在我们已经稍微改变它， 这powerOf函数立即
返回一个函数。
请注意，回国后， 有一个开放的大括号。
该公司预计，该输入双。
该公司预计，该输出双。
然后在关键字 分离代码本身。
所以这是一个匿名函数。
它实际上并没有一个名字，而 它被称为求幂之前。
但正如我们所看到的，只是真的 没有提及求幂
外面的功能。
因此，这并不重要。
所以，这个匿名函数 所谓的，因为它是无名的，
但它仍然被使用 本规范的范围内。
>> 在接下来的那些我 要继续希望
吹你的心一点点。
我们可以简化此，甚至更多。
因为因为是敏锐 早前指出，
也许我们其实都知道，由 从这个代码推断，是什么
这段代码的输出将是。
而事实上，在此匿名函数， 我们可以在推断出实际上的数据的类型。
>> 所以在这一块，我们不再 需要明确定义
数据的真实存在的类型 输入和输出从该函数
一对夫妇的原因。
一个是我们定义，最多的 原型的封闭功能，
什么类型的数据这个匿名的 功能应的输入和输出。
而从另一方面，我们 可从代码推断
到这里，我们正在接受 输入，类型为双
并返回一个双。
>> 请注意，在这里我们还没有明确的 定义的参数名称
这个函数接受。
因此，我们看到，我们可以参考一下 使用$ 0，$ 1所参数，
等等，等等，这取决于 使用的参数的数目
在此功能。
>> 这一点，你会 看到很多是这样的开放式大括号
定义后跟 $ 0，然后一些操作，
然后封闭大括号。
这是一个匿名函数 执行此操作。
它有这个参数在哪里 它的类型推断。
这第一个参数为$ 0
而一些操作 发生在那个$ 0
>> 听众：所以，美元符号 是指基本的参数，
，0表示第一个？
DAN Armendariz环：这是正确的。
因此，美元符号的基本意思 参数，和0表示的第一个。
但是，它的工作原理特别是在 这种情况下，我还没有命名
在我的匿名函数的参数。
>> 听众：请问Perl或一些有 这个美元符号，美元0在那里呢？
DAN Armendariz环：这呢，我很抱歉？
听众：请问Perl的有 这种0美元，美元1--
DAN Armendariz环：我不是 太熟悉了Perl中，
但是PHP什么定义变量 基于美元的迹象。
而且可能有一些语言 具有这样的功能。
事实上，斯威夫特借用一个 很多这样的功能
从很多其他语言。
我们看到它的Python提示。
型的这种定义 似乎来自OCaml的。
而我们刚才一大堆 东西从各种不同的语言。
这就是很好的一个 关于斯威夫特的事情
是，它需要大量的最好 从一堆语言的想法
和它们鞋拔一起 成一个超级语言。
事实上，如果你让我 继续吹你的头脑，
所以我们一直在做这一切。
我们也许可以简化一点 通过实现那当然位，
斯威夫特有一个指数 功能内置的。
如果我输入达尔文，这 只是库
拥有这种功能称为战俘，现 我能简化我的功能功率
要如下。
它是将要返回 该匿名函数。
>> 但是看看多么简单，这是现在。
这是一个匿名函数 正在接受某些类型的数据，
它是要为一个 论点明确，
为$ 0表示是Double类型的引用。
它会返回一个类型双。
但return语句 现在是隐含的。
>> 而正是这种精确的风格， 非常，斯威夫特非常普遍，
到处都是。
我们要看到这 所有的时间在斯威夫特。
所以，我展示这一切要 你是因为这个语法。
这是很常见 看，这意味着它
是一个匿名函数 正在执行
对这些参数的一些操作。
还有一个隐含的回报。
所以它绝对是一回事 我们这样说，就在这里。
>> 由于这种花 支架是一个功能，
我们执行此操作 第一个参数。
我们将返回。
但这种外部回报 在返回的整体功能，
这整个匿名函数 我们刚刚创建的。
其他问题吗？
好吧，我不知道 你们是为此做好准备，
但我们还可以走的疯狂与斯威夫特。
你准备好了吗？
OK，这是伟大的。
>> 现在，我们实际上有能力 要在斯威夫特，因为如何模块化
以及如何基于协议是，以 定义我们自己再用运营商。
像在这种情况下，我们没有 运营商exponentiation--好，
用于执行一些权力。
但我可以在斯威夫特，定义一个新的 运营商，做正是。
因此，在这种情况下，有 一堆语法在这里。
我会允许你看它 在家的时候，你看这个。
但是，我们定义这个缀 操作者，**，将允许我们，
通过定义是什么 功能**实际
确实，以接受一个左手 侧和右手侧，
然后，返回的，该指数 左手侧到右手侧。
>> 所以，现在突然我的 已经创建了一个新的分子。
所以2 ** 3装置2的3次幂。
[令人兴奋的声音]本所 本身应该让你像，
OK，螺丝C.我要去 雨燕一路。
这很棒。
这是非常奇妙的。
>> 虽然这是一个很好的例子。
但我从来没有一次外 本实施例的实际
定义自己的操作符。
但尽管如此，它显示了 很多雨燕的动力
为什么这实际上是 真的非常酷。
好了，是吗？
听众：如果你是 定义你自己的运营商，
你怎么知道你不小心 尝试创建一个操作符是
在某处C，像 在斯威夫特的地方隐藏起来，
就像一个不起眼的一个，你 可能以前没看过。
>> DAN Armendariz环：所以，如果你想 定义你自己的操作，
有限定的危险 一个比现有的运营商。
这将详细的水平 我不认为我们有时间去了。
但是，这是一个危险。
而这实际上是非常的原因 我没有使用插入符号符号，这
当我们输入了动力，我们通常 用4个小尖号5或东西
这样，就在我们 Gchatting哥们或什么的。
但在这种情况下，实际 会造成冲突。
所以我避免它只是因为 我碰巧知道在这种情况下，
，这将导致该冲突。
>> 好吧。
现在不幸的是， 最后7分钟
我必须继续吹 你的心一点点。
所以，请允许我向您展示 一些其他的事情也是如此。
>> 我们已经展示了这个想法 具有这些匿名函数，
这些盖子，让您 那种传递函数左右。
你可以归还。
你可以操纵它们。
你可以做各种疯狂的事情。
>> 但有其他的事情， 恰好是有用
被的能力，而不是 久违这些功能
在一个函数，传递函数 作为参数传递给另一个功能。
你可能会在地球上的思维以及为什么 我希望做这样的事情？
>> 好吧，让我们说，我想 借此运营商，我
辛辛苦苦创建和应用 它以一串不同数量的
在数组中。
因此，在这种情况下，我有一个数组 integers-- 1,4，7,2，5，10，56。
而且我要加倍他们。
的方式，我们将一般 做到这一点是只写
for循环的简单的 遍历所有的人
并执行某种 方操作过他们，
输入这些新值到一个新的 可变的，或者说，在这里一个新的数组。
和的输出的值 结果是那么所有这些阵列，
或者更确切地说，所有这些 元素现在平方。
>> 我们可以做同样的 对多维数据这东西，
但有点警钟 应该将关闭
说，也许有 某种程度上，我们将
可以这样简化一点。
而事实上是有的。
如果我们能够创建什么 一个可以让我们
接受，作为一种食肉动物，一个功能？
所以在这种情况下，采取一 看看这些参数。
我们将接受双打的名单。
然后我们要去 接受功能
在一个所谓的F这个变量是怎么回事 采取双，并返回一个双。
而整个输出 这整个功能
称为映射器将会 回到所谓的双阵列。
>> 这是什么会，然后让我 做的是遍历该列表
做同样的事情，但现在 应用该功能在每个
在该列表中的各个值。
所以，我真的不知道什么f是。
不要紧，对我来说。
但是，只要它需要在一个双， 它执行一些操作，
然后返回一个 双，我将被
能够映射功能跨越 列表中的每一个元素。
>> 而这种类型的节目是 所谓高阶函数，
在这里我们传递功能 周围的参数
和做事情的功能。
这有点像把所有的这些 我们在CS50所学的想法
并考虑他们排序 的下一级。
而这一切都是CS51风格的东西。
因此，我们会去深入 更多的类这样的。
>> 但是这也是 这里很重要，因为我们
看到很多功能 这是在斯威夫特使用
基本上不 这一点，我们有
一些数字，数字的一些阵列。
我们将传递 数组转换成我们的映射器。
而我们也将 通过一些函数，它
我们已经确定在这里。
这将是正方形。
而我们要那么 方所有这些数字
并存储到这个结果在这里。
>> 所以，这种情况下，我们已经定义了我们 自己的函数调用映射。
但这个确切的事情是， 事实上，内置斯威夫特。
有各种各样的 函数调用的地图。
有一个地图功能， 有一个减少功能，
并有一个过滤功能， 这基本上是应用功能
在一个每一个元件 列表来修改它们以某种方式。
>> 听众：所以因为你正在改变 将数据转换成另一种格式
通过function--
DAN Armendariz环：对。
是啊，这样的功能 我们正在接受
正在改变以某种方式的数据。
在这种情况下，我们要么 现蕾，或者我们多维数据吧，
还是真的，我们可以执行 它没有任何操作的。
>> 但让我告诉你再如何 是要看看在实践中。
再次，我快 时间位。所以我不
要能够走在所有 这里详细的源代码。
但我鼓励你这样做。
我们会尽快将它张贴 可能在这之后的谈话。
>> 但是，如果你看看这个， 假设我们有号码列表，
号在此的数组 变量被叫号码。
然后，我们要执行这个 这些数字过滤操作。
因此，过滤器是一个较高 为了功能
接受一个数组，并且也是功能。
而在每一个元素 阵列，它执行该功能。
>> 如果该函数返回 真的，它使该项目。
如果该函数返回false， 它丢弃该项目。
然后它返回一个列表 随后被由所有
的那些已被过滤的项目。
>> 因此在另一个话，这是 同样的想法，在成绩册。
我们可能有各种档次 这个值被叫号码。
可以是100和70，和 40，等等，等等。
这是什么做过滤的通知 这是语法糖
一个匿名函数。
这是一个匿名函数说 这是我接受的参数
将是，如果它 大于70，
那么这将返回true，这意味着 该项目将被保存在这个过滤器。
因此，让我们一点点 这个更具体。
如果我有一个数字数组 它包括100，70和40，
我执行这个过滤器 操作这些中的每一个。
使第一个是100这个值。
100大于或等于 70是真的，这
意味着100被保持在 该数组的新副本。
70也通过。
但40没有。
那么在passingCount返回 是元件100和阵列70--
100，逗号，70。
这些是仅有的两个 被保留的项目。
这样一来，我之所以很快就通过 很多这类高阶的
事情是因为这是普通 您将在斯威夫特看到漂亮的东西
频繁，正在进行操作 使用该匿名函数的语法。
>> 这里也有一些很酷的东西。
交换机是在斯威夫特果然厉害， 我的意思是，就像疯了，疯强大。
你可以使用交换机， 实际上你可以应用它们
到的范围，这是那种疯狂， 做花哨的东西一样。
>> 但在最后几分钟， 我想跳过前面很远
并告诉你如何具体例子 我们可以在iOS应用使用SWIFT创建。
所以，当你在做 这一点，你必须采取
一看at--苹果的 文档，它们
有很多真正好的教程 创建第一个应用程序。
我鼓励你做 是因为他们带你
通过精确地所有步骤的什么 点击创建iOS应用程序。
>> 但在这里，我们有这个iOS应用程序。
而这是一个非常简单的应用程序真的。
如果我运行这个，让我告诉 你是什​​么样子。
所有这本质上确实是它 从互联网的JSON文件拉
我已经存储在服务器上。
这JSON文件 定义图像，使
我再通过，周期在我 应用程序，从我的web服务器映像。
>> 所以，我这里有getNextImage。
它加载图像从互联网上， 然后在屏幕上显示出来。
>> 所以这是非常简单的。
但这里的目的是展示 你如何才能结合起来的东西
从后者几周CS50的 成实际的iPhone应用程序。
换句话说，或许中的一个 的事情，你会想要做
是有一个iOS的应用程序 可以从互联网提取数据
和显示用户的某些信息。
这完全是点 这里这个源代码。
>> 因此，有很多可说的对 如何做实际的iOS开发。
有很多疯狂的语法 我们还没有看到相当，但
像类，一类实际上是什么。
我们可以在很大程度上忽略 该暂时。
>> 但是请注意，我们已经包含 在这各种各样的事情
我们已经看到像 具有特定名称的函数。
而当我们给那些 功能正确的名称
这是由iOS的预期，事实上 这种感觉有点不可思议。
当你创建一个，但 iOS的应用程序，有
具体函数名 由手机本身被称为
作为应用程序加载尝试 实际创造的过程
运行你的应用程序。
如此反复，有很多的事情，我 有掩饰这里，以便我们
谈论这个特别。
但我建议你看一下也许 在其他iOS研讨会上，但也有一些
该在线教程里面做的 描述一个更好的工作
的特定信息。
>> 但是，我们可以看到一对夫妇的事情， 从这里代码有意思。
请注意，我们有if语句。
顺便说，一个重要 有关if语句的事
是周围的括号 布尔表达式是可选的。
不过，花括号是不可选的， 无论多么少或者多行代码
你有一个if语句。
你不能有一个if语句 无斯威夫特花括号。
>> 这是很好，有点傻。
但有历史原因的。
它应该拯救你自己。
像这样的例子，你不能 消除围绕着大括号
if语句。
这些其实都是必需的。
所以，我鼓励你 看看这个。
但是有一个更 构造，我想
向您提供迅捷的 是新雨燕2.0​​对比
旧版本的雨燕， 这是下面的内容。
让我们看看在哪里我把它放在这儿？
>> 因此，在这个函数中调用 fetchJSON，该功能
负责拉的JSON 从URL，这恰好文件
要运行在我的CS50的IDE。
我刚开始的Apache， 把我的JSON文件存在，
而我能够再扳指 使用来自互联网的数据
这个功能和这个URL， 这是由电话提供的。
它由一个提供 库您使用时
你正在做一些iOS应用程序的开发。
>> 请注意这里是有这个不寻常 语法结构被称为后卫。
而真正的这一切都是在 雨燕是验证的一种方式
有些事情有 在你得到满足
继续执行功能的其余部分。
所以我可以有，使用 这个可选的类型，
我能找到的网址 运行此NSURL功能
并存储该到一个URL 恒定，然后检查
看是否URL为零，因为它 正想返回一个可选的类型。
如果它是零，那么我会 打印出一个错误，然后返回。
>> 但是，相反，什么后卫让 我们做的是非常的事，
但确保其 实际的情况是URL
已正确由NSURL设置。
并且如果是的话，它 跳过这一点，它
可以让你继续 网址已被正确定义。
但如果是的情况下 URL不是正确定义，
如果这个函数返回一个错误 或其他一些意想不到的事
实际发生，该保护结构 让我们再输出错误
并立即返回。
是？
>> 听众：所以这是一种 像一个，如果再别的吗？
DAN Armendariz环：这是一种 就像如果当时别人，是的，
但此URL随后 定义低于这个一切。
如果通过这种控卫的话， 实际上将填充数据
并在剩余的可使用 在你的函数的源代码。
因此，我怀疑你会 开始看到这个后卫也是如此。
同时也要注意这一点。
>> 所以只要看几个其他的 的事情，在这里这个权利是什么，
你觉得，只是基于什么 我们之前在谈论什么？
>> 听众：认为它会在列表中运行？
>> DAN Armendariz环：所以很接近。
这是一个我们所定义的功能。
我们正在输入的功能 作为参数传递给这个函数在这里。
>> 听众：[听不清]如果不是零。
因此，它在列表中，对不对？
>> DAN Armendariz环：如果错误不是零， 让is--，所以我必须滚动。
好吧，让我们来看看，我真的不能 滚动到这里的权利。
误差是正被一个参数 传递给这个匿名函数。
这是一个匿名函数。
它没有名字。
但是，我们接受这三个 参数，数据，响应和错误。
它是要返回void，所以 它不会返回任何东西。
这是内容 的该功能。
然后我们有内部的访问 功能到每个这些参数。
>> 所以这是一个旋风 巡演的语言。
但我希望这一点， 你把希望
看看一些教程 具体到iOS开发与斯威夫特，
特别是如果你去 苹果的开发者网站page--
他们有很多真正的好 让你开始教程。
但希望只是这一小时的谈话 关于语法本身已经给
你有足够的开始使用了。
>> 我们将发布所有这些源 研讨会上网站代码
尽快，并且还幻灯片 所以你必须对所有这些参考。
不过，好运与您的项目。
并感谢大家的光临。
>> [掌声]