1.了解编程语言
-
编程无非是为计算机编写一步一步的指令。 如果您曾经写下食谱的步骤或在假期中草拟照顾宠物的指示,那么您已经完成了编写程序的基本步骤。 关键是简单地知道你想完成什么,然后确保你写出正确的说明,告诉别人如何实现那个目标。
-
尽管编程在理论上很简单,但可能会让您失望的是细节。 首先,你需要确切地知道你想要什么。 如果你想要一份鸡肉炒面的食谱,遵循烤三文鱼的食谱对你没有任何好处。
-
其次,您需要写下从起点到结果所需的每一条指令。 如果您跳过一个步骤或乱序编写步骤,您将不会得到相同的结果。 就好像你开车去餐馆时,导航没有告诉你“需要在特定路口转弯”的指令,那么其余99%的指令是否正确就不那么重要了,也就是说,如果只有一个指令是错误的,你就不会达到你想要的目标。
-
你的目标越简单,就越容易实现。 编写一个在屏幕上显示计算器的程序比编写一个监控核电站安全系统的程序要简单得多。 您的程序越复杂,您需要编写的指令就越多,您需要编写的指令越多,您忘记指令、错误地编写指令或以错误的顺序编写指令的可能性就越大。
-
编程只不过是控制计算机解决问题的一种方式,无论该计算机是笔记本电脑、智能手机、平板电脑还是可穿戴手表。 在开始编写自己的程序之前,您需要了解编程的基本原理。
不要把“学习编程”和“学习特定的编程语言”相混淆。 您实际上可以在不接触计算机的情况下学习编程原理。 一旦理解了编程原理,就可以轻松学习任何特定的编程语言,例如 Swift。
编程原则
-
要编写程序,您必须编写计算机可以遵循的指令。 无论程序做什么或有多大,世界上的每个程序都只是由计算机一次一个地遵循的逐步指令组成。 最简单的程序可以由一行组成,例如
print ("Hello, world!")
-
上面的程序会在控制台输出"Hello, world!",这个行为以后称之为“打印”。显然,一个由单行组成的程序将不会完成很多事情,所以大多数程序由多行指令(或代码)组成,例如
print ("Hello, world!") print ("Now the program is done.")
-
这个两行程序从第一行开始执行,紧接着第二行的指令执行,然后停止。 当然,您可以继续向程序添加更多指令,直到您有一百万条指令可供计算机依次执行,一次一个。
-
按顺序编写指令是编程的基础。 但是,它也有局限性。 例如,如果您想将同一条消息打印五次,则可以使用以下代码:
print ("Hello, world!") print ("Hello, world!") print ("Hello, world!") print ("Hello, world!") print ("Hello, world!")
-
以这种方式编写相同的五个指令既乏味又多余,但它仍然有效。 如果您想将同一条消息打印一千次,怎么办? 你还要写一千次相同的指令吗?
-
多次编写相同的指令是笨拙的。 为了使编程更容易,目标是编写最少数量的指令来完成最多的工作。 避免多次编写相同指令的一种方法是使用称为“循环”的第二个基本编程原则来组织您的指令。
-
循环背后的思想是多次重复一个或多个指令,但只需将这些指令写一次。 典型的循环可能如下所示:
for i in 1...5 { print ("Hello, world!") }
-
上面指令的含义是:第一行告诉计算机重复循环五次,第二行告诉计算机在屏幕上打印消息“Hello, world”。 第三行只是定义了循环的结束。
-
现在如果你想让计算机打印一千次消息,你不需要写一千次相同的指令。 相反,您只需要修改循环重复的次数:
for i in 1...1000 { println ("Hello, world!") }
-
尽管循环比一系列连续的指令阅读和理解起来令人略微迷惑,但循环使重复指令更容易,而无需多次编写相同的指令。
-
大多数程序不会只按照顺序或循环列出指令,而是使用两者的组合,例如
print ("Hello, world!") print ("Now the program is starting.") for i in 1...1000 { print ("Hello, world!") }
-
在这个例子中,计算机依次跟随并执行前两行指令,然后在循环中重复执行最后三行。 通常,当您只需要计算机按照这些指令执行一次时,按顺序列出指令就可以了。 当您需要计算机多次运行指令时,您就需要使用循环。
-
使计算机变得强大的不仅仅是能够按顺序或循环执行指令,还可以做出决策。 决策意味着计算机需要评估某些条件,然后根据该条件决定下一步要做什么。
-
例如,您可以编写一个程序,将某人锁定在计算机之外,直到该人输入正确的密码。 如果此人键入正确的密码,则程序会授予该人访问权限。 但是,如果此人输入了错误的密码,该程序将阻止访问计算机。 以下是此类决策的示例:
if password == "secret" { print ("Access granted!") } else { print ("Login denied!") }
-
在这个例子中,计算机要求输入密码,当用户输入密码时,计算机会检查它是否与“secret”这个词匹配。 如果是,则计算机授予该人访问计算机的权限。 如果用户没有输入“secret”,则计算机拒绝访问。
-
做出决定是使编程灵活的原因。 如果您编写一系列连续的指令,计算机每次都会以完全相同的方式遵循这些指令列表。 但是,如果包含决策指令,也称为分支指令,则计算机可以根据用户的需求或操作做出不同响应。
-
用一个游戏举例子。 几乎没有一款游戏可以完全按照顺序组织的指令编写,因为这样游戏每次都会以完全相同的方式进行。 实际上,游戏需要始终适应玩家的行为。 如果玩家将物体向左移动,则游戏需要做出与玩家向右移动物体或什么都不做的反应不同的响应。 使用分支指令可以使计算机能够做出不同的反应,因此程序永远不会以完全相同的方式运行。
-
所以,如果你要编写计算机程序,您需要按照以下三种方式之一来组织指令,如图 1-1 所示。
- 顺序(Sequentially):计算机一个接一个地执行指令。
- 循环(Loop):计算机重复执行一个或多个指令。
- 分支(Branching):计算机根据外部数据选择遵循一组或多组指令执行。
-
虽然简单的程序可能只能按顺序组织指令,但每个大程序都按顺序、循环和分支组织指令。 使编程更像是一门艺术而不是一门科学的原因是,编写程序没有唯一的最佳方法。 事实上,完全有可能编写两个行为完全相同的不同程序。
-
因为没有单一的“正确”编写程序的方法,所以只有指导方针可以帮助您轻松编写程序。 归根结底,重要的是您编写了一个有效的程序。
-
在编写任何程序时,有两个通常相互排斥的目标。 首先,程序员努力编写易于阅读、理解和修改的程序。 这通常意味着编写多个指令,明确定义解决特定问题所需的步骤。
-
其次,程序员尝试编写高效执行任务的程序,使程序运行得尽可能快。 这通常意味着通过使用技巧或利用那些即使是有经验的程序员也难以理解和混淆的鲜为人知的功能来尽可能地压缩多条指令。
-
一开始,努力使您的程序尽可能清晰、合乎逻辑和易于理解,即使您必须编写更多指令或键入更长的指令才能做到这一点。 之后,随着您在编程方面获得更多经验,您可以努力创建尽可能最小、最快、最高效的程序,但请记住,您的最终目标是编写能正常工作的程序。
结构化编程
-
小程序的指令较少,因此更易于阅读、理解和修改。 不幸的是,小程序只能解决小问题。 为了解决复杂的问题,你需要用更多的指令编写更大的程序。 你输入的指令越多,你犯错误(称为bug)的可能性就越大。 更糟糕的是,程序越大,就越难理解它是如何工作的,因此你可以以后修改它。
-
为了避免编写一个单一的、庞大的程序,程序员只需将一个大程序分成更小的部分,称为子程序或函数。 这个想法是每个功能都解决一个任务。 这样可以轻松编写并确保其正常工作。
-
一旦所有单独的函数都工作了,就可以将它们连接起来创建一个单一的大型程序,如图 1-2 所示。 这就像用砖头盖房子,而不是试图用一块巨大的岩石雕刻一整个房子。
-
将大型程序划分为较小的程序有几个好处。 首先,编写较小的函数既快捷又容易,而小的函数使指令易于阅读、理解和修改。
-
其次,函数就像一起工作的构建块,因此多个程序员可以处理不同的函数,然后将单独的函数组合在一起以创建一个大程序。
-
第三,如果你想修改一个大程序,你只需要拉出、重写、替换一个或多个函数。 如果没有函数,修改一个大程序意味着要查看一个大程序中的所有指令,并试图找到需要更改的指令。
-
函数的第四个好处是,如果您编写了一个有用的函数,您可以将该函数插入到其他程序中。 通过创建经过测试的有用函数库,您可以通过重用现有代码快速轻松地创建其他程序,从而减少从头开始编写所有内容的需要。
-
当你把一个大程序分成多个功能时,你有一个选择。 您可以将所有程序存储在一个文件中,也可以将每个函数存储在一个单独的文件中,如图 1-3 所示。 通过将函数存储在单独的文件中,多个程序员可以在不影响其他人的情况下处理不同的文件。
-
将所有函数存储在一个文件中,可以轻松查找和修改程序的任何部分。 但是,您的程序越大,您需要编写的指令就越多,这会使搜索单个大文件变得笨拙,就像翻阅非字母字典的页面寻找特定单词一样。
-
此外,将所有函数存储在一个文件中使得多个程序员无法处理程序的不同部分,因为每个程序员都需要相同的文件。
-
将所有函数存储在单独的文件中意味着您需要跟踪包含这个函数的文件。 好处是修改函数要容易得多,因为一旦打开正确的文件,您只能看到单个函数的说明,而不是十几个或更多其他函数的说明。
-
因为今天的程序可以变得如此之大,所以将函数存储在单独的文件中是很常见的。
事件驱动编程
- 在计算机的早期,大多数程序从第一条指令开始,然后一行一行地执行每条指令直到结束。 此类程序严格控制计算机在任何给定时间的行为方式。
- 当计算机开始显示带有窗口和下拉菜单的图形用户界面时,所有这一切都发生了变化,因此用户可以在任何给定时间选择要执行的操作。 突然间,每个程序都不得不等待用户执行诸如选择菜单命令或单击按钮之类的操作。 现在程序必须对用户做出反应。
- 每次用户做某事时,它都被认为是一个事件。 如果用户单击鼠标左键,则与用户单击鼠标右键是完全不同的事件。 与规定用户在任何给定时间可以做什么不同,程序现在必须响应用户所做的不同事件。 使程序响应不同的事件称为事件驱动编程。
- 事件驱动程序将一个大程序划分为多个函数,其中每个函数响应不同的事件。 如果用户单击菜单命令,则函数会运行其指令。 如果用户单击按钮,不同的函数会运行另一组指令。
- 事件驱动的编程总是等待响应用户的操作。
面向对象编程
- 将大型程序划分为多个功能,可以轻松创建和修改程序。 然而,试图理解如此大的程序是如何工作的往往令人困惑,因为没有简单的方法来确定哪些函数一起工作或它们可能需要从其他函数中获取哪些数据。
- 更糟糕的是,函数经常修改其他函数使用的数据。 这意味着有时一个函数会在另一个函数使用它之前修改数据。 使用错误的数据会导致其他函数失败,从而导致整个程序失败。 这种情况不仅会创建不太可靠的软件,而且还会使确定如何以及在何处解决问题变得更加困难。
- 为了解决这种情况,计算机科学家创建了面向对象的编程。 目标是将一个大程序划分为更小的函数,但将相关的函数组织成称为对象的组。
- 为了使面向对象的程序更容易理解,对象还对现实世界中的物理项目进行建模。
- 假设您需要编写一个程序来控制机器人。 将这个问题按任务划分,您可以创建一个函数来移动机器人,第二个函数告诉机器人如何看到附近的障碍物,第三个函数来计算要遵循的最佳路径。 如果机器人的运动出现问题,您将不知道问题出在控制运动的函数、控制机器人如何看到障碍物的函数,还是计算最佳路径的函数。
- 将相同的机器人程序分成多个对象可能会创建一个 Legs 对象(用于移动机器人)、一个 Eye 对象(用于查看附近的障碍物)和一个 Brain 对象(用于计算避开障碍物的最佳路径)。 现在,如果机器人的运动出现问题,您可以将问题隔离到 Legs 对象中存储的代码。
- 除了在对象中隔离数据之外,面向对象编程背后的第二个想法是使重用和修改大型程序变得容易。 假设你用踏板代替了机器人的腿。 现在您必须修改用于移动机器人的函数,因为踏板的行为与腿的行为不同。 接下来,您必须修改用于计算绕过障碍物的最佳路径的函数,因为踏板会迫使机器人绕过障碍物,而腿则允许机器人越过小障碍物并绕过较大的障碍物。
- 如果您想用踏板替换机器人的腿,面向对象的编程只允许您拉出 Legs 对象并将其替换为新的 Treads 对象,而无需影响或需要修改构成程序其余部分的任何其他对象 .
- 由于大多数程序会不断修改以修复错误(称为bug)或添加新功能,因此面向对象编程允许您创建由单独的构建块(对象)组成的大型程序,并且仅通过修改单个对象来修改程序。
- 面向对象编程的关键是通过封装、继承和多态这三个特性来隔离程序的各个部分并提高可重用性。
封装
-
封装的主要目的是保护程序的一部分并将其与程序的另一部分隔离。 为此,封装隐藏了数据,因此它永远不会被程序的其他部分更改。 此外,封装还包含操作存储在该对象中的数据的所有函数。 如果出现任何问题,封装可以很容易地将问题隔离在特定对象中。
-
每个对象都意味着完全独立于程序的任何其他部分。 对象在属性中存储数据。 操作这些属性的唯一方法是使用称为方法的函数,这些函数也封装在同一对象中。 属性和方法的组合在一个对象中隔离,通过使用对象作为构建块,可以轻松快速可靠地创建大型程序,如图 1-4 所示。
继承
- 创建一个庞大而复杂的程序很困难,但让这项任务更加困难的是从头开始编写整个程序。 这就是为什么大多数程序员重用现有程序的一部分的原因有两个。 首先,他们不必从头开始重写他们需要的功能。 这意味着他们可以更快地创建大型程序。 其次,他们可以使用已经证明可以正常工作的经过测试的代码。 这意味着他们可以通过重用可靠的代码更快地创建更可靠的软件。
- 重用代码的一个大问题是你永远不想制作重复的副本。 假设您复制了一个函数并将其粘贴到第二个位置。 现在,您在同一个程序的两个不同位置存储了完全相同代码的两个副本。 这会浪费空间,但更重要的是,它可能会在未来引起问题。
- 假设你在一个函数中发现了一个问题。 要解决此问题,您需要在复制并粘贴到程序其他部分的任何地方修复此代码。 如果您将此代码复制并粘贴到程序中的其他两个位置,则必须在两个位置找到并修复该代码。 如果您将此代码复制并粘贴到程序中的一千个位置,则必须在一千个不同的位置找到并修复该代码。
- 这不仅不方便且耗时,而且还会增加意外忽略代码并在该代码中留下问题的风险。 这会创建不太可靠的程序。
- 为了避免修复同一代码的多个副本的问题,面向对象的编程使用了一种叫做继承的东西。 这个想法是一个对象可以使用存储在另一个对象中的所有代码,但无需物理复制该代码。 相反,一个对象从另一个对象继承代码,但该代码只存在一个副本。
- 现在,您可以根据需要多次重复使用一份代码副本。 如果您需要修复一个问题,您只需要修复该代码一次,这些更改就会自动在通过继承重用该代码的任何对象中生效。
- 基本上,继承使您可以重用代码,而无需物理地制作该代码的重复副本。 这样可以轻松地重用代码并在将来轻松修改它。
多态性
-
每个对象都由数据(存储在属性中)和用于操作该数据的函数(称为方法)组成。 通过继承,一个对象可以使用另一个对象中定义的属性和方法。 但是,当您需要一个函数(方法)来使用不同的代码时,继承会产生问题。
-
假设您创建了一个视频游戏。 您将汽车定义为一个对象,将怪物定义为第二个对象。 如果怪物向汽车扔石头,那么石头就是第三个物体。 要使汽车、怪物和岩石在屏幕上移动,您需要创建一个名为 Move 的方法。
-
不幸的是,汽车需要在屏幕上移动,而不是怪物或扔石头。 您可以创建三个函数并将它们命名为 MoveCar、MoveMonster 和 MoveRock。 但是,一个更简单的解决方案是只为所有三个函数指定相同的名称,例如 Move。
-
在传统编程中,你永远不能给两个或多个函数起相同的名字,因为计算机不知道你想运行哪个函数。 但是,在面向对象的编程中,由于多态性,您可以使用重复的函数名称。
-
多态允许您使用相同的方法名称,但用不同的代码替换它。 多态之所以起作用是因为每个 Move 函数(方法)都存储在一个单独的对象中,例如一个对象代表汽车,第二个对象代表怪物,第三个对象代表扔出的石头。 要运行每个 Move 函数,您需要确定包含要使用的 Move 函数的对象,例如
Car.Move Monster.Move Rock.Move
-
通过识别您想要操作的对象和您想要使用的函数,面向对象的编程可以正确地识别出要运行的指令集,即使一个函数的名称与另一个函数的名称相同。
-
本质上,多态性允许您创建描述性函数名称,并在您还使用继承时随意重用该描述性名称。
-
封装、继承和多态的组合构成了面向对象编程的基础。 封装将程序的一部分与另一部分隔离开来。 继承使您可以重用代码。 多态允许您重用方法名称,但使用不同的代码。
了解编程语言
-
编程语言只不过是一种表达思想的特定方式,就像西班牙语、阿拉伯语、中文或英语等人类语言一样。 计算机科学家创建编程语言来解决特定类型的问题。 这意味着一种编程语言可能非常适合解决一种类型的问题,但在解决另一种类型的问题时却很糟糕。
-
最流行的编程语言是 C,它是为对计算机硬件的低级访问而设计的。 因此,C 语言非常适合创建操作系统、防病毒程序和硬盘加密程序。 任何需要完全控制硬件的东西都是 C 编程语言的完美任务。
-
不幸的是,C 可能是神秘和稀疏的,因为它是为计算机的最大效率而设计的,而没有考虑人类阅读、编写或修改 C 程序的效率。 为了改进 C,计算机科学家创建了 C 的面向对象版本,称为 C++。 很快就出现了更精致的 C++ 版本,称为 Objective-C,这是 Apple 用于 macOS 和 iOS 编程的语言。
-
因为 C 最初是以牺牲人类效率为代价来提高计算机效率的,所以包括 C++ 和 Objective-C 在内的所有 C 变体也可能难以学习、使用和理解。 这就是 Apple 创建 Swift 的原因。 Swift 的目的是为您提供 Objective-C 的强大功能,同时让您更容易学习、使用和理解。 Swift基本上是Objective-C的改进版,Objective-C本身就是C++的改进版,C++是C的改进版。
-
计算机编程的每一次演变都建立在以前的编程标准之上。 当您使用 Swift 编写程序时,您可以使用 Swift 的独特功能以及面向对象编程、事件驱动编程、结构化编程和编程的三个基本构建块(顺序、循环和分支)。
-
与所有计算机编程语言一样,Swift 包含一个固定的命令列表,称为关键字。 要告诉计算机做什么,您可以使用关键字来创建使计算机执行单个任务的语句。
-
您已经看到了打印文本的 print 关键字,例如
print ("Hello, world!")
-
这个 Swift 关键字是 print(代表打印); 然后你必须告诉关键字你想打印什么,用括号括起来。 正如学习人类语言需要首先学习用于书写字母的基本符号,例如字母表或其他符号,学习编程语言也需要首先学习该特定编程语言的关键字。
-
尽管 Swift 包含数十个关键字,但您不必一次学习所有关键字即可使用 Swift 编写程序。 您最初只需要学习一些关键字即可。 随着您的经验越来越丰富,您将逐渐需要学习更多的 Swift 关键字。
-
为了让编程尽可能简单,Swift(像许多编程语言一样)使用看起来像普通英语单词的关键字,例如 print 或 var(变量的缩写)。 然而,许多编程语言也使用代表不同特征的符号。
-
常见的符号是加法 (+)、减法 (-)、乘法 (*) 和除法 (/) 的数学符号。
-
为了识别一起工作的命令的开始和结束,Swift(和C一样)使用大括号将代码括起来,例如
{
print ("This is a message");
}
-
编程语言与人类语言不同,您可能会拼错单词或忘记用句点结束句子,而人们仍然可以理解您在说什么,编程语言并不那么宽容。 对于编程语言,每个关键字都必须拼写正确,并且每个符号都必须在需要的地方使用。 拼错单个关键字、使用错误的符号或将正确的符号放在错误的位置,您的整个程序将无法运行。
-
编程语言是精确的。 编程的关键是写
- 尽可能少的代码
- 尽可能多的代码
- 代码尽可能容易理解
-
您希望编写尽可能少的代码,因为编写的代码越少,就越容易确保其正常工作。
-
您需要尽可能多的代码,因为这使您的程序更有能力解决更大的问题。
-
您需要易于理解的代码,因为这样可以轻松解决问题和添加功能。
-
不幸的是,这三个标准经常相互矛盾,如图 1-5 所示。
-
如果您编写尽可能少的代码,这通常意味着您的代码不能做太多事情。 这就是为什么程序员经常使用快捷方式和编程技巧来压缩代码的大小,但这会增加代码的复杂性,使其更难理解。
-
如果您编写的代码尽可能多,这通常意味着编写大量命令,这会使代码更难理解。
-
如果您编写易于理解的代码,它通常不会做太多事情。 如果你编写更多的代码来让它做更多的事情,这会让它更难理解。
-
归根结底,计算机编程与其说是一门科学,不如说是一门艺术。
一般来说,最好专注于使代码尽可能易于理解,因为这将使修复问题和添加新功能更容易。 此外,易于理解的代码意味着其他程序员可以在您无法完成的情况下修复和修改您的程序。 -
这就是 Apple 创建 Swift 的原因:在不牺牲 Objective-C 的强大功能的情况下,使代码比 Objective-C 更容易理解。 尽管比 Objective-C 更强大,但 Swift 代码通常比等效的 Objective-C 代码更短。 因此,Apple 未来的编程语言将是 Swift。
Cocoa框架
-
关键字(和符号)可让您向计算机发出指令,但没有一种编程语言可以提供创建所有类型程序所需的所有可能命令。 为了提供额外的命令,程序员使用关键字来创建执行特定任务的函数。
-
当他们创建一个有用的函数时,他们通常将它保存在其他有用函数的库中。 编写程序时,可以使用编程语言的关键字以及存储在库中的任何函数。 通过重用存储在库中的函数,您可以创建更强大、更可靠的代码。
-
例如,一个库可能包含用于显示图形的函数。 另一个库可能包含将数据保存到磁盘并再次检索它的函数。 还有一个库可能包含用于计算数学公式的函数。 为了更轻松地编写 macOS 和 iOS 程序,Apple 创建了一个包含有用函数的库框架,称为 Cocoa 框架。
-
重用现有框架有两个原因。 首先,重用框架使您不必编写自己的指令来完成其他人已经解决的任务。 一个框架不仅提供了现成的解决方案,而且一个框架也经过了其他人的测试,因此您可以使用该框架并确保它可以正常工作。
-
使用现有框架的第二个原因是为了一致性。 Apple 提供了用于定义程序在屏幕上的外观的框架,称为用户界面。 这定义了从在屏幕上显示窗口到允许您通过单击鼠标调整窗口大小或关闭窗口的程序应该如何工作。
-
编写自己的指令来在屏幕上显示窗口是完全可能的,但是编写自己的指令很可能需要时间来创建和测试,最终结果将是一个用户界面,其外观或行为可能与其他用户界面不同 macOS 或 iOS 程序。
-
但是,通过重用现有框架,您可以快速创建自己的程序,并确保您的程序的行为方式与其他程序的行为方式相同。 尽管编程听起来可能很复杂,但 Apple 提供了数百个预先编写和测试过的函数,可帮助您快速轻松地创建程序。 您所要做的就是编写自定义指令,让您的程序解决特定的、独特的问题。
-
要了解 Apple 的 Cocoa 框架的工作原理,您需要了解面向对象编程,原因有二。 首先,Swift 是一种面向对象的编程语言,所以如果要充分利用 Swift,你首先需要了解面向对象编程的优点。
-
其次,Apple 的 Cocoa 框架是基于面向对象的编程。 要了解如何使用 Cocoa 框架,您需要使用对象。
Cocoa 框架是为创建 macOS 程序而设计的。
一个名为 Cocoa Touch 的类似框架专为创建 iOS 应用程序而设计。 因为 Cocoa Touch 框架 (iOS) 基于 Cocoa 框架 (macOS),所以它们的工作方式相似但提供了不同的功能。 -
通过依赖 Cocoa 框架,您的程序可以在每次 Apple 更新和改进 Cocoa 框架时获得新功能。 例如,拼写检查是 Cocoa 框架的内置功能。 如果您使用 Cocoa 框架编写程序,您的程序会自动获得拼写检查功能,而无需编写任何额外的代码。 当 Apple 改进 Cocoa 框架中的拼写检查功能时,您的程序会自动获得这些改进,而无需您额外的努力。
-
Cocoa 框架是一个通用术语,描述了 Apple 的所有预先编写和测试的代码库。 Cocoa 框架的一些不同部分可以为您的程序提供音频播放功能、图形功能、联系人信息存储功能(如姓名和地址)以及 Internet 功能。
-
Cocoa 框架为典型的 macOS 程序奠定了基础。 您所要做的就是编写使您的程序独一无二的 Swift 代码。
视图-模型-控制器设计(View-Model-Controller)
-
可以编写一个大型程序并将所有代码存储在一个文件中。 但是,这使得在您的程序中查找任何内容变得更加困难。 更好的解决方案是将一个大程序分成几个部分,并将相关部分存储在单独的文件中。 通过这种方式,您可以快速找到您需要修改的程序部分,并使多个程序员可以轻松地协同工作,因为一个程序员可以处理一个文件,而第二个程序员可以处理第二个文件。
-
当您将程序分成单独的文件时,最好保持井井有条。 就像你可以把袜子放在一个抽屉里,把 T 恤放在第二个抽屉里,这样你就可以很容易地找到你需要的衣服,你应该把你的程序组织成多个文件,这样每个文件只包含相关数据。 这样您就可以快速轻松地找到需要修改的文件。
-
可以存储在文件中的数据类型通常属于三类之一,如图 1-6 所示:
- View 视图(用户界面)
- Models 模型
- Controllers 控制器
-
视图或用户界面是用户所看到的。 每个用户界面的目的都是显示信息、接受数据和接受来自用户的命令。 在过去,程序员通常通过编写代码来创建用户界面。 虽然您仍然可以在 Swift 中执行此操作,但它很耗时、容易出错且不一致,因为一个程序员的用户界面可能看起来和行为与第二个程序员的用户界面完全不同。
-
更好的选择是直观地设计您的用户界面,这是 Xcode 允许您做的。 只需在您的用户界面上绘制对象,例如按钮、文本字段和菜单,Xcode 就会自动创建一个无错误、外观一致的用户界面,只需几秒钟即可创建。 当您使用 Xcode 创建用户界面时,您实际上是在使用 Apple 的 Cocoa 框架来完成它。
-
就其本身而言,用户界面看起来不错,但它什么都做不了。 为了让程序做一些有用的事情,你需要编写解决特定问题的代码。 例如,彩票挑选程序可能会分析最近挑选的号码并确定下周最有可能中奖的号码。 计算有用结果的代码部分称为模型。
-
模型实际上与视图(用户界面)完全分开。 这使得在不影响模型的情况下轻松修改用户界面(反之亦然)。 通过使程序的不同部分尽可能与程序的其他部分隔离,可以减少修改程序时发生错误的几率。
-
由于模型始终与视图完全分离,因此您需要一个控制器。 当用户选择命令或在用户界面中键入数据时,控制器从视图中获取该信息并将其传递给模型。
-
模型响应此数据或命令并计算新结果。 然后它将计算结果发送给控制器,控制器将其传回视图显示给用户查看。 任何时候,视图和模型都是完全分开的。
-
使用 Xcode,这意味着您将大部分 Swift 代码编写并存储在定义程序模型的文件中。 如果您正在计算中奖彩票号码,则用于执行这些计算的 Swift 代码将存储在模型中。
-
您还需要在控制器文件中编写和存储 Swift 代码。 在一个简单的程序中,您可能只有一个视图。 在更复杂的程序中,您可能有多个视图。 对于每个视图,您通常需要一个控制器文件来控制该视图。 所以你编写和存储 Swift 代码的第二个地方是在控制器文件中。
-
在简单的程序中,将模型与控制器组合在一个文件中是很常见的。 然而,对于更大、更复杂的程序,最好为您的模型创建一个(或多个)文件,并为每个控制器创建一个文件。 控制器文件的数量通常等于构成用户界面的视图数量。
-
一旦你将你的程序清楚地分成模型、视图和控制器,你就可以通过用一个新文件替换一个文件来轻松快速地修改你的程序。 例如,如果你想修改用户界面,你只需设计一个不同的视图,将它连接到你的控制器,你就完成了,而无需触及你的模型文件。
-
同样的,如果您想修改模型以添加新功能,您只需更新您的模型文件并将其连接到您的控制器,而无需触及您的视图。
-
事实上,这正是程序员为 macOS 和 iOS 创建程序的方式。 他们的模型保持不变。 他们所做的只是为 macOS 编写一个控制器和视图,为 iOS 编写一个控制器和视图。 然后他们可以使用完全相同的模型创建 macOS 和 iOS 应用程序。
程序员如何工作
-
在早期,一个程序员可以得到一个想法并编写代码来使该程序工作。 如今,程序要复杂得多,用户的期望也更高,因此您需要在编写任何代码之前设计您的程序。 事实上,大多数程序员实际上根本不会花太多时间来编写或编辑代码。 相反,程序员将大部分时间花在思考、计划、组织和设计程序上。
-
当程序员对程序有了一个想法时,第一步是确定这个想法是否有任何好处。 程序必须解决特定类型的问题。 例如,文字处理器可以轻松编写、编辑和格式化文本。 电子表格可以轻松输入数字并根据这些数字计算新结果。 演示程序使键入文本和插入图形以创建幻灯片变得容易。 即使是电子游戏也能通过为玩家提供具有挑战性的谜题或目标来解决无聊的问题。
软件开发的第一个最大失败是没有定义要解决的特定问题。 软件开发的第二大失败是确定要解决的特定问题,但低估了解决该问题所需步骤的复杂性。 您必须知道要解决什么问题以及如何解决该问题。 如果您对其中任何一个都不了解,则无法编写有用的程序。
-
一旦您有了要解决的问题的想法,下一步就是定义如何解决该问题。 有些问题实在是太难解决了。 例如,您将如何编写程序来编写畅销小说? 您也许可以编写一个程序来帮助您写小说,但除非您确切地知道如何以可预见的方式创作畅销小说,否则您根本无法编写这样的程序。
-
知道要解决的问题是您的目标。 一旦您清楚地了解了您的问题,您就需要确定解决该问题所需的所有步骤。 如果您不知道如何解决特定问题,您也无法告诉计算机如何解决该问题。
-
定义解决问题所需的步骤后,现在您终于可以编写程序了。 通常,您在继续编写程序之前编写并测试好每一部分代码。 通过这种方式,您可以逐渐扩展程序的功能,同时确保每个部分都能正常工作。
-
使用 Xcode 时的主要步骤是:
- 编写代码并设计您的用户界面
- 编辑您的代码和用户界面
- 运行和测试你的程序
-
当你的程序最终完成时,你猜怎么着? 它从未完成。 总会有您需要修复的错误和您想要添加的新功能。 程序员实际上花在编辑和修改现有程序上的时间比他们创建新程序的时间要多。
-
当您编写和编辑代码时,您会使用编辑器,这是一个类似于文字处理器的程序,可让您键入和编辑文本。 当你设计和修改你的用户界面时,你会使用 Xcode 中一个叫做 Interface Builder 的功能,它类似于一个绘图程序,可以让你在屏幕上拖放和调整对象的大小。 当您运行和测试您的程序时,您会使用编译器,它将您的 Swift 代码转换(或编译)为实际运行的 macOS 程序。
-
要创建 macOS 程序,您只需要一份 Xcode 的副本,这是 Apple 的免费编程工具,您可以从 Mac App Store 下载。 在 Macintosh 上安装 Xcode 后,您只需学习 Xcode 和 Swift,就可以免费创建自己的程序。
概括
- 要学习如何为 Macintosh 编写程序,您需要学习几种不同的技能。 首先,您需要了解编程的基本原理。这包括按顺序、循环或分支组织指令,以及理解结构化编程技术、事件驱动编程和面向对象编程。
- 其次您需要学习特定的编程语言。 对于 Macintosh,您将学习 Swift。 这意味着您将学习 Swift中使用的关键字,同时学习如何在单独的文件中编写和组织 Swift 代码。
- 第三,您需要知道如何使用 Xcode,这是 Apple 用于创建 macOS 和 iOS 应用程序的编程工具。 Xcode 允许您编写和编辑 Swift 代码,以及让您直观地设计和修改您的用户界面。
- 第四,你需要学习如何使用 Apple 的 Cocoa 框架,这样你就可以专注于编写指令,让你的程序做一些独特的事情。
- 无论您是想编写自己的软件来销售,还是想出售您的编程技能为他人创建定制软件,您都会发现编程是一项任何人都可以学习的技能。
- 请记住,编程只不过是解决问题。 通过了解如何使用 Swift 和 Xcode 解决问题,您可以比您想象的更容易 、更快地为 Macintosh 创建您自己的程序。