在Swift框架中重用代码

复制和粘贴代码很糟糕,当发现错误并不得不使用它修复所有应用程序时,情况更是如此。 但是有办法避免吗?

就在这里! 苹果提供了一种称为框架的工具,以简化代码共享。 此外,它还为我们提供了一种将相关代码分组(模块化)和限制对代码访问(封装)的机制。

在本文中,我们将介绍什么是框架以及为什么使用它们。 我将逐步指导如何创建和构建框架,以及最终如何在应用程序中使用框架。 本文将专门用Swift编写框架中的代码。

什么是框架?

框架是一个结构化目录,可以包含共享代码和共享资源,例如图像,笔尖(XIB和情节提要的混合形式)和其他资产。 您可以将其视为传递代码和/或其他可重用资产以使代码正常工作的软件包。

为什么要使用框架?

我们已经介绍了使用框架的主要原因。 另一个很好的理由是简化与组织服务的集成。

例如,贝宝(Paypal)提供了框架来帮助应用程序处理信用卡交易。 Onfido提供了执行远程身份验证的框架。

框架可以节省客户与服务的集成工作。 为客户节省了时间和金钱。 客户使用您的服务的速度越快,您就越早开始赚钱💰。

此外,在选择提供商时,时间和精力可能是潜在客户的关键因素。 实际上,市值超过92亿美元的Stripe始于对支付处理器的整合挫折。

如何建立框架

在本节中,我们将引导您完成创建和构建框架的过程。 该框架将包含一个简单的登录屏幕。

在接下来的步骤中,我们将:

  1. 使用Cocoa Touch Framework模板创建项目
  2. 使用XIB添加视图控制器
  3. 将视图插入我们的视图控制器以允许用户登录
  4. 将XIB中的视图连接到LoginViewController类
  5. 以编程方式加载视图控制器
  6. 在框架之外访问视图控制器

如果您已经熟悉这些内容,请随意跳过任何部分或全部。

1.创建项目

首先,从菜单栏中选择File > New > Project… ,以Xcode创建一个框架。

通过选择iOS Cocoa Touch Framework项目模板继续,然后单击“ 下一步”

最终命名您的框架,您可以随意命名。 我要使用名称MyFramework 。 还要确保选择的语言Swift 。 命名后,单击“ 下一步”,然后选择要存储项目的位置,最后单击“ 创建”

您现在应该有一个带有空框架的项目。 让我们继续,向我们的项目添加一个屏幕,该屏幕可以被多个应用程序使用。

2.添加视图控制器

让我们继续添加一个空的XIB文件,在该文件中,我们将使用界面生成器来设计登录屏幕。 从菜单栏中选择File > New > File… ,然后选择Cocoa Touch Class

将您的 LoginViewController命名为子类 UIViewController 。 校验 该选项还创建XIB文件 。 从语言 下拉菜单选择Swift

使用Cocoa Touch Class模板,Xcode将添加一个具有我们指定名称的XIB和一个Swift文件。 它将为我们创建从XIB到视图控制器的必要链接。

3.将视图添加到我们的视图控制器

此时,我们的LoginViewController XIB将完全为空。 让我们为电子邮件和密码添加标签和文本字段,以允许用户进行身份验证。

单击对象库。 出现搜索栏时,搜索标签 ,然后将标签拖放到空白画布上。

对文本字段重复三个步骤。

根据需要对齐视图,然后将其复制并粘贴,因此您有两个标签和两个文本字段,一个用于电子邮件,一个用于密码。 使用有意义的文本(例如EmailPassword)编辑标签。 最后添加一个按钮,以允许用户执行登录操作。

至此,我们已经具备了使用户登录所需的一切。不必担心视图的布局和外观,这不在本文的讨论范围之内。

4.将视图连接到视图控制器

在这一步中,我们仅需创建一个链接即可将XIB中的电子邮件和密码文本字段视图链接到我们的视图控制器,以从中获取文本。 另外,我们还将希望将“登录”按钮上的轻击动作连接到我们将在其中进行登录的视图控制器上的功能。

首先打开LoginViewController.xib,然后打开助手编辑器,它是Xcode UI右上角的两个相交的循环图标。

然后一一选择文本字段并按住Control键,然后将视图拖放到视图控制器上。 这将打开一个弹出窗口,使我们可以配置XIB和视图控制器之间的连接。 现在, 文本字段的连接设置为Outlet ,将名称设置为与每个文本字段相关的名称 ,例如emailTextField类型 UITextField并从最后一个下拉列表中选择 。 重复密码文本字段的步骤。

现在,拖放“登录”按钮,但在这种情况下,选择 连接 操作”将其命名为signIn,然后从类型下拉菜单下方的下拉菜单中选择“ Touch Up Inside ”。 这有点不同,我们在视图上而不是在视图本身上挂钩一个动作,在此我们指定了一个函数来对“登录”按钮上的点击做出反应。

现在,我们将用户名和密码打印到控制台。 在登录功能内添加以下行:

 打印(“用户名\(emailTextField.text)密码\(passwordTextField.text)”) 

现在,我们拥有了使用户登录所需的一切。在这里,我们将不涉及身份验证,该代码旨在演示访问框架代码和资源的应用程序。 我们将以编程方式加载视图控制器,但在此之前,我们的视图控制器必须知道要加载哪个XIB。

5.以编程方式加载视图控制器

我们的XIB包含我们的视图的声明以及它们的结构,配置和链接方式。 XIB具有与谁链接以及如何链接的概念,但是我们的视图控制器对我们的XIB并不了解,因此当我们实例化视图控制器时,目前不会在视图控制器上创建视图和链接。 我们必须告诉我们的视图控制器在实例化时从何处读取其视图。 为从xib读取的视图控制器添加以下自定义init函数:

 在里面() { 
  super.init(nibName:“ LoginViewController”,bundle:Bundle(for:LoginViewController.self)) 
  } 
 需要初始化吗?(编码器aDecoder:NSCoder){ 
  fatalError(“ init(coder :)尚未实现”) 
  } 

我们将调用init()函数来使我们的视图控制器实例化。 UIViewController已经包含一个init函数,该函数使我们可以指定要读取的XIB(文件名)以及在何处找到该XIB文件。 init(nibName:_, bundle:_) 。 对于XIB位置,我们指定它将与LoginViewController类位于同一捆绑包中。

让我们忽略required init? 函数,因为我们不会使用它,但是当我们需要自定义初始化程序时,必须在视图控制器中指定它。

到目前为止,我们应该能够以编程方式加载视图控制器,但只能在框架内部的代码内。 我们想从使用框架的应用程序初始化我们的view控制器。

6.在框架外部访问视图控制器

Swift具有适当的访问控制,这些访问控制限制了可以从其他代码访问代码的哪些部分。 当我们不为函数和变量指定任何访问控制时,Swift会将它们默认为内部访问,这样init()等效于internal init() 。 在这种情况下,我们框架中包含的所有代码都可以访问init函数,但不能在外部访问。 为了允许从框架外部访问我们的代码,我们必须在init函数之前加上public访问控制声明,这样init函数应类似于:

  public init(){ 
  super.init(nibName:“ LoginViewController”,bundle:Bundle(for:LoginViewController.self)) 
  } 

但这不是使我们的init函数public可用的全部。 我们的init函数位于一个类中,该类也没有指定访问控制,因此是internal 。 如果无法访问我们的课程,那么将可以使用我们的公共init方法。 为了弥补这一点,我们还必须在班级之前添加public访问控制。 您可能必须在关键字override之后将public添加到任何函数,但是

 公共类LoginViewController:UIViewController {...} 

现在,我们可以从使用框架的应用程序初始化视图控制器。

这就是我们向所有开发人员展示如何以标准化框架格式共享代码和资源的全部工作。

消耗框架

在本节中,我们将通过现在将创建的应用程序来使用在上一节中构建的框架。 如果您跳过了上一部分,则可以在此处找到框架项目源代码。

我们会:

  1. 使用iOS应用目标创建一个新项目
  2. 在我们的视图控制器中添加一个登录按钮
  3. 在点击按钮时显示框架登录屏幕

1.创建新项目

让我们为框架消费者应用程序创建一个新项目。 从菜单栏中选择文件 > 新建 > 项目…

在iOS选项卡下搜索并选择Single View App ,然后单击Next

MyApp中输入产品名称 。 选择“ Swift”作为“ 语言” 。 单击下一步

当提示您将新项目保存到何处时,为方便起见,请将其保存在我们的框架项目的同一目录下。

2.添加一个登录按钮

让我们在View Controller中添加按钮,该按钮是为我们自动创建的,作为Single View App模板的一部分。 打开Main.storyboard并将一个按钮拖放到空白画布上。 就像我们之前在框架项目中对登录按钮所做的一样,打开助手编辑器并将该按钮从情节ViewController板拖放到ViewController类上。 将连接类型配置为Action ,将其命名为login,然后从类型下拉列表下方的下拉列表中选择Touch Up Inside 。 您的ViewController类中应该具有以下空函数:

  @IBAction func login(_ sender:Any){ 
  } 

在登录功能中,我们要显示框架中的登录屏幕。

3.轻按按钮即可显示框架登录屏幕

至此,我们创建了一个新项目,在自动创建的视图控制器中添加了一个按钮,并将该按钮的点击连接到了ViewController类中的一个函数。 当用户点击“登录”按钮时,我们希望显示先前创建的框架的登录屏幕。 但是在我们做到这一点之前,我们首先必须将框架链接到我们的应用程序。 我们可以通过多种方式访问​​该框架,但是在本文中,我们将使用Xcode工作区来实现。 在工作空间中,您可以添加多个项目,并将它们链接在一起,就像它们在单个项目下一样。

要创建工作空间,请选择文件 > 新建 > 工作空间…,并将其命名为MyApp 。 将其保存在与您的应用程序和框架项目相同的目录中。

该工作区一开始将是空的,因此让我们将两个项目都添加到我们的工作区中。 从菜单栏中选择文件 > 将文件添加到“ MyApp”… ,然后添加MyApp.xcodeprojMyFramework.xcodeproj ,它们分别位于名为MyAppMyFramework的目录下。 确保这些项目均未在其他XCode窗口上打开,否则它们将不会显示其内容。

接下来,选择MyApp项目文件(项目导航器中的蓝色文档图标,该图标位于右侧窗格的第一个选项卡下)。 然后在项目设置窗口的“ 常规”选项卡下和“ 嵌入式二进制文件”部分下,单击+按钮。 将出现一个新窗口,其中包含您在工作空间中拥有的所有选项。 选择MyFramework.framework ,然后单击添加

现在,我们已经添加了框架,当用户点击登录按钮时,该应用程序可以显示登录屏幕。 打开ViewController.swift并在import UIKit下添加import MyFramework ,这将允许我们从文件中访问框架代码。 接下来,将以下代码行添加到ViewController类中的登录函数中:

  present(LoginViewController(),动画:true,完成:nil) 

当用户点击应用程序中的登录按钮时,此行将显示框架中的登录屏幕。

就这样! 现在,您可以运行该应用程序,并亲自观察它的运行!

摘要

现在您应该知道:

  • 什么是框架
  • 为什么要使用它们
  • 如何建立和消费它们
  • h̶o̶w̶̶t̶o̶̶m̶a̶k̶e̶̶e̶a̶s̶y̶̶m̶o̶n̶e̶y̶

下一步

使用Xcode工作区消耗框架很困难。 有没有更简单的使用框架的方法?

您将在下一篇文章中找到该问题的答案。 敬请关注! 在Twitter或Medium上关注我。