我如何创建使用SiriKit的Swift应用的故事

介绍

我一直对Swift和SiriKit的工作方式感到好奇。 说我已经决定创建一个小项目来学习Swift并集成Siri。 我将介绍从开始到使Siri可以与我的应用程序一起使用的所有步骤。

坐下来享受学习新语言的过程,让Siri与该应用程序一起工作。

#Step1:想法

我想做一个小应用。 没什么好详细说明的。 该应用向我展示了Swift的强大功能以及该语言的工作原理。 我需要提醒我,我希望该应用程序可以与Siri一起使用,因此它不能像计算器一样简单。

一段时间后,我想到了一个主意:一个推荐看电影的应用程序。 因此,如果我说“ Siri,推荐一部电影”,我的应用程序将查找以前没有推荐过我的电影。 简单吧? 我们开始做吧。

#Step2:开始学习Swift的工作原理

在工作期间,我经常玩Javascript。 因此,我希望不会有太多问题。 我渴望开始!

第一天 :我想开始做简单的事情。 一个将两个数字相加的函数。 为此,我们需要学习如何声明函数和变量。

首先,我将XCode配置为不带有白色背景的眼睛。 我喜欢午夜或黄昏主题。

然后,我开始了一个新项目,并打开了编辑器。 另外,您不需要任何其他操作即可运行程序。 该应用程序实时运行,并响应您在编辑器中所做的更改。 凉。

让我们声明一些变量并创建一个函数。

变数

好吧,这里的第一个问题。 没问题,这与Javascript不同。

在Javascript ES6中,有很多方法来声明变量:

  • 关于范围,您有: varlet
  • 如果它是常量,则具有: const

名字对我来说很有意义。 从“变量”中获取变量,从“常量”中获取常量,然后从……中获取(如果您知道答案,请告诉我)。

在Swift中有一个小的区别:

  • 您使用“ var”声明变量
  • 您使用“ let”来声明一个常量

您可以在此处详细了解其他类型的变量

函数呢?

这是基本功能的样子:

此功能将在控制台中打印“ 3”。 您可以从上面的屏幕截图中学到以下内容:

  1. 您用单词“ func”声明一个函数,后跟该函数的名称。
  2. 您需要在函数(如Typescript)中添加“:”来指定参数的类型。 为此,请设置变量的名称,然后设置“:”和输入的类型(布尔值,字符串,整数…)
  3. 您还必须指定函数输出的类型。 关闭函数中的最后一个括号后,添加“->”
  4. 调用函数时,必须添加与函数声明中相同的“标签”,并用“:”指定值,然后是标签的值。

您可以进行一些更改并使在函数声明中添加“ _”符号更加容易,以便在调用它时可以删除标签。

声明函数时,您还可以执行其他操作,例如在函数中添加“…”以声明多个参数而无需为每个参数声明标签。

您可以转到文档并查看其所有示例。 真的很好解释。

其他基础

我还建议阅读有关“控制流”的文章,并特别注意“ for”循环。 它们与Javascript略有不同。

第二天:结构与课程

在Swift编程语言中,您具有结构和类。 它们或多或少是相同的,但是最后,由于它们的复杂性,您可能更喜欢使用结构而不是类。 在这里,您可以阅读有关这两种数据的所有信息。

您需要了解一些基本知识:

  1. 结构和枚举是值类型。 这意味着将其赋值给变量或函数时将其复制。 他们没有相同的参考。
  2. 另一方面,它们是引用类型。 从原始文档“不同于值类型,当引用类型分配给变量或常量或将它们传递给函数时,不会复制引用类型。 而不是副本,而是使用对相同现有实例的引用。”

我建议您看一下诸如继承和初始化之类的其他内容。 如果您了解Java,那么您将熟悉这些概念。

使用类时,初始化很重要。 在Swift中,不允许在类中使用默认“ nil”值创建变量。 您必须初始化它。

第3天和第4天:将Swift作为面向对象的编程

如果您不熟悉面向对象的程序设计,建议您先阅读Internet并寻找一些示例,然后再继续。

面向对象的语言使用对象将数据和代码分为不同的有用单元。 围绕对象组织数据和代码。

正如我在上一节中提到的那样,当您声明一个类时,您需要使用初始化程序,否则会出现错误:

因此,您需要编写这样的类:

让我们看看上面的类的所有不同部分。

  1. 您添加init()方法来初始化一个类,并通过参数传递要初始化的类的值。
  2. “自我”一词引用了类的属性而不是参数。 在Swift中,当属性和参数具有相同的名称时,参数优先。 这意味着,如果我们不将“ self”一词添加到“ model”中,则参数及其类型将优先,而“ model”将成为“ let”类型。 请记住,您使用let来定义常量。 因此,这将引发错误。

如果使用结构,则不需要初始化程序。 在结构中,默认的初始化函数是根据结构的属性来推断的。

您应该看的另一件事是在类的“可选链接”部分。 大多数时候,您会在类中创建一些可选的属性,并且不想初始化。

您将使用“?”将属性设置为可选。 然后,您需要打开该属性才能访问它。

除此之外,您还应该熟悉以下概念:

  • 子类。 继承属性和方法
  • 覆写
  • 属性以及如何使用结构
  • 扩展程序。 这是有关为什么在代码中使用Extension的很好的阅读。

第5天:开始使用Swift直观地创建应用

为了了解如何在Swift中构建应用,您需要对MVC(模型,视图控制器)的工作方式有明确的概念。

模型引用应用程序内的用户数据,视图是用户界面,控制器负责协调模型和视图之间的交互。

因此,无论模型中发生什么更改,您都将使用控制器在视图中进行更改并在用户界面中进行表示。

相反,用户可以访问视图,因此,当用户与视图交互时,控制器会解释这些操作并将其传达给模型。

连接视图和控制器

在Xcode编辑器内部,所有功能都将在ViewController类内部完成。

当您想将按钮与功能进行连接(控制器)时,将使用关键字“ @IBAction ”,后跟功能名称:

当用户按下按钮时,可以使用“视图”和“ UIColor”在用户界面中进行更改:

在前面的示例中,我们已经看到了如何使用IBAction。 使用接口构建器(IB前缀)时,我们需要使用IB-Actions和IB-Outlets将接口连接到功能和属性。

@IBAction允许您创建一个函数,当发生特定的用户交互时将调用该函数。 我们正在将接口与我们创建的功能连接起来。

@IBOutlet允许您将用户界面与我们定义的属性连接。

提示:使用拖放编辑器使创建IBAction和IBOutlet更加容易。

您可以 在此处 看到有关如何使用IB输入来计算斐波那契数列的完整示例

第6天:导航和存储用户首选项

导航

在下面的示例中,我将向您展示如何启用导航器并将用户首选项存储在您的应用程序中。

创建导航器很容易:

  1. 在主视图控制器中创建一个按钮
  2. 在主视图控制器旁边插入另一个视图控制器。
  3. 最后,将其从按钮拖放到新的视图控制器,并添加一个新的“ Segue”。 Segue是应用程序中所有不同视图控制器之间的连接器。
  4. 如果要添加导航器以返回,请选择第一个视图控制器,然后单击con Editor> EmbedIn> Navigation Controller。

每当两个控制器之间的连接“ Segue”即将发生时。 例如,单击按钮转到另一个视图时,将在执行segue的viewController中执行函数“ prepareForSegue”。

然后,我们可以使用该函数在更改视图之前运行所需的任何代码。

上面有一个示例代码,该示例代码将在更改视图之前在新的viewController中更改背景色。

存储用户首选项

小用户数据通常存储在名为“ NUserDefaults”的类中。

要将数据保存在该类中,您只需执行以下步骤:

  1. 使用NUserDefaults.standard方法创建对共享默认对象的引用
  2. 然后,您可以存储与名为“ forKey”的键链接的值
  3. 然后,调用synced()方法以确保在该时刻保存了该方法。

要恢复存储的数据,可以在viewDidLoad方法中添加以下代码:

如果要查看完整的示例(导航+保存用户首选项),请 在此处。

#Step3:构建基本的MovieApp

在上一步中,我介绍了我认为对开始项目工作必不可少的内容。 如果您认为自己需要更多,请访问Swift的官方文档站点,它很棒,而且解释清楚。

我认为学习语言的最佳方法是先阅读一些基础知识,然后再创建自己的项目。 这就是我在这里要做的。

我将详细介绍我使用过的所有内容以及创建MovieApp所学的内容。 我非常确定我将使用新功能,库…在上一步中没有使用和解释过。

第一天:界面。 表格检视

我的应用程序的界面将很简单。 所有电影都会出现的表格视图 您可以在Mail,Dropbox,Twitter的时间轴等应用中看到这种设计…

我们将在项目中使用的对象是“ Table View Controller” 。 我们将其设置为应用程序的入口点(应用程序启动时将加载的第一个控制器)

我们还将包括第二个“视图控制器” ,它将显示您在“表视图”中点击的电影的详细信息。

您可以想象,一旦点击以查看详细信息,我们需要返回。 因此,我们还将包括一个导航栏。 请记住,您必须将其包括在第一个控制器中。 在这种情况下, “表视图控制器”

我们的项目分为三类:

  1. MoviesTableViewController类。 此类负责控制并在表格视图中显示元素。 在这里,我们将详细介绍我们要放映的电影及其所有详细信息,例如标题,关于和得分。
  2. DetailController类。 此类将显示我们在Movie类中声明的所有详细信息。
  3. MovieClass。 此类是不言自明的。 它包含电影对象。 我们将使用它从MoviesTableViewController声明新对象。

我们最终得到一个带有电影标题的简单“表”视图,一旦点击单元格,就会打开一个包含所有详细信息的新视图。 不用担心,我将在最后添加整个源代码。

我想突出显示代码的这一部分,在其中我将TableViewControllerViewController进行通信

在这里,我将选择的影片对象发送到详细视图。 然后,在详细信息视图中,我将使用@IBOutlets将信息添加到UI

我需要知道在TableView中点击了哪些元素。 这就是为什么我必须标识indexPath的原因。 然后,我用它来引用电影对象数组中的元素。

第2天:从电影API检索数据

在这个项目中,我将从 TheMovieDB.ORG API 获取电影数据

为了向API发出请求,我们使用了一个名为“ Alamofire”的Swift库

我们在MoviesTableViewController内部的viewDidLoad方法中执行请求。 让我解释下面的代码:

代码的第一部分是创建一个ActivityIndi​​cator(加载程序)。 也许我们对API的请求将花费很长时间。 因此,我们决定添加一个加载器元素。

其次,我们启动加载程序,然后使用我们之前解释的库对API进行请求。

最后,对于获得的每部电影,我们都实例化Movie类,并将其附加到movies数组。

在代码末尾,我们重新加载表格视图,以便我们可以显示所有获得的电影。 否则,随着TableView在获取信息之前加载,我们将获得一个空白表。

结果如下:

源代码

#Step4:将应用程序连接到Siri

首先是第一件事。 您需要创建一个Apple Developer帐户并为您的应用创建一个标识符,说您想启用Siri。

然后,我们必须创建一个意图定义文件。 转到文件→新建→目标,然后选择“意图扩展”。 从该文件,我们可以创建我们的自定义意图和响应。

目前,Sirikit Shortcuts仅可通过Beta版访问。 我将在访问该部分后立即对其进行更新。