0%

了解如何使用以 Swift 编写的松耦合模块插件系统通过新功能扩展应用程序。

模块(插件)如何工作?

        如果你可以创建可以在不知彼此的情况下一起工作的对象,那会很酷吗? 想象一下,你正在构建一个动态表单。 根据一些内部条件,将使用来自启用模块的数据来构成字段。

        例如,你拥有模块 ABC ,其中 A 为您提供字段 1、2、3B 模块负责字段4、5,而 C 是字段6的提供者。现在,如果您关闭 B, 您应该只能看到字段1、2、3和6。如果已打开所有内容,则应该看到从1到6的所有字段。

        我们可以将完全相同的模式应用于许多事物。 试想一下最大的插件生态系统之一。 WordPress 使用 钩子(英文:hooks) 来扩展核心功能。 这些都是基于我上面刚刚提到的概念。 这是 事件驱动的体系结构设计模式(英文:Event-driven architecture) 的一部分。 现在的问题是,我们如何使用 Swift 实现类似的东西? 🤔

阅读全文 »

        最终指南,如何在指定的,方便的,可使用的初始化工具等帮助下初始化你的 Swift 数据类型。

什么是初始化?

         初始化(英文: Initialization) 是准备使用的类,结构或枚举实例的过程。

        这个过程是通过初始化程序来处理的,初始化程序只是一种特殊的函数,通常为它们保留 init 关键字-因此您不必使用 func 关键字-通常您不会从初始化程序中返回任何值 。

阅读全文 »

        了解如何创建具有模块化和可读性的对象。

使用初衷

        在 iOS 之旅的开始,我遵循了 YouTube 上的教程。 我看到一些使用如下所示的方法来创建 UI 对象。

1
2
3
4
let makeBox: UIView = {
let view = UIView()
return view
}()

        作为学习者,我复制了练习并使用了它。 但是,有一天,有人问我:“为什么要添加 {} ,为什么 () 末尾存在? 它是计算属性吗?” 我无法回答。

阅读全文 »

        在Swift中什么是惰性存储属性? 你应该如何以及何时使用它? 快速入门指南,需要记住的一些关键点。

        首先回顾一下在 Swift 中声明和初始化存储属性的最常用方法:

直接分配

        通过直接分配初始值来对常量和变量存储的属性进行初始化的最简单形式:

1
2
3
4
5
6
7
8
// constant
let fontSize: CGFloat = 24.0

// variable
var spacing: CGFloat = 16.0

// Optional
var title: String?
阅读全文 »

        了解如何在 Swift 中使用惰性属性来提高性能,避免使用可选参数或只是为了使初始化过程更加简洁。

        在程式设计中, 惰性初始是一种拖延战术。在第一次需求出现以前,先延迟创建物件、计算值或其它昂贵程序。这通常是以一个旗号来实现,用旗号来标示是否完成其程式。每次请求对象时,会先测试此旗号。如果已完成,直接传回,否则当场执行。
对于此想法更一般的论述,可见惰性求值。对指令式语言,这个模式可能潜藏着危险,尤其是使用共享状态的程式习惯。

        以设计模式的观点来说,惰性初始通常会和工厂方法模式合作,这结合了三种构想:

  • 使用一个工厂去得到一个类别的实例(工厂方法模式)。
  • 将实例存在一个集合中,所以下次要求一个实例却有相同参数时,可以得到同一个实例(可和单例模式来做比较)。
  • 在第一次时,使用惰性初始来实例化物件(惰性初始模式)。
阅读全文 »

        在本快速教程中,我将解释并向你展示如何使用 Swift 编程语言实现对象池设计模式。

        对象池(英语:object pool pattern)是一种设计模式。一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象。池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁它。这是一种特殊的工厂对象。

        若初始化、实例化的代价高,且有需求需要经常实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的效能提升。从池子中取得对象的时间是可预测的,但新建一个实例所需的时间是不确定。

阅读全文 »

        外观设计模式是复杂子系统上的简化界面。 展示一个使用 Swift 的快速实例。

        外观模式(Facade pattern) ,是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。

阅读全文 »

        可选参数可以说是 Swift 最重要的功能之一,也是将其与 Objective-C 之类的语言区分开来的关键。 通过被迫处理可能为 nil 的情况,我们倾向于编写更具可预测性和较少错误的代码。

        但是,有时可选参数可能会使你处于一个很难处理的局面,在程序员看来,你知道(或至少在假设之下)某个变量在使用时始终为 non-nil ,即使它是 可选类型。 就像在视图控制器中处理视图时一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
class TableViewController: UIViewController {
var tableView: UITableView?

override func viewDidLoad() {
super.viewDidLoad()
tableView = UITableView(frame: view.bounds)
view.addSubview(tableView!)
}

func viewModelDidUpdate(_ viewModel: ViewModel) {
tableView?.reloadData()
}
}
阅读全文 »

        在 Swift 中创建对象或值的集合时,我们通常使用标准库提供的数据结构-例如 ArrayDictionarySet 。 尽管这三个案例涵盖了大多数用例,但有时创建自定义包装器集合可以使你使代码更可预测,并且更不易出错。

        此次,让我们看看作为应用程序开发人员的我们如何在 Swift 中定义此类自定义集合,以及结合枚举的强大功能,如何让我们为自己创建一些非常漂亮的 API

阅读全文 »

        通过使用一些 自定义序列(符合 Swift 标准库中的 IteratorProtocol ),学习迭代器设计模式。

        在面向对象编程里,迭代器模式 是一种设计模式,是一种最简单也最常见的设计模式。它可以让用户透过特定的接口访问容器中的每一个元素而不用了解底层的实现。

        这次,我将重点介绍迭代器设计模式。 该模式在 Swift标准库 中大量使用,如果你需要创建迭代器,有一些协议可以为你提供支持,但是老实说:我从来没有直接实现过这种模式。 😅

        事实是,在99%的用例中,你将永远不必处理这种模式,因为对 Swift 中直接内置的迭代器提供了惊人的支持。 始终使用序列,数组,字典而不是直接实现此模式,但是很高兴知道事情是如何进行的。 🙃

阅读全文 »