了解Swift 4中的泛型函数和类型

编写可维护的代码应该是每位软件工程师都应该意识到的一个问题,因为从长远来看,它具有回报。 通常,为了尽快完成工作,我们倾向于重复自己。 这通常涉及复制和粘贴我们可能对函数的类似实现,并进行调整以适合我们想要的内容。
复制在某种程度上增加了复杂性并阻塞了可读性。 一个好的方法总是尽可能多地采用DRY(不要重复自己)原则。 在我们的代码中,考虑如何设计API和适应的应用架构非常重要,因为从长远来看,这会影响代码的可维护性。

因此,回到讨论主题。 Swift中的泛型。 使用通用代码,我们可以编写可重用的函数和数据类型,这些函数和数据类型可以与匹配我们定义的约束的任何类型一起使用。 目的是排除共享功能并减少样板代码。

我们有约束和不受约束的泛型。 对于不受约束的泛型,我们不能对它们做太多事情。 受约束的泛型用协议表示。 我们所知道的协议在其符合类型上声明了一组要求。

在这一点上,让我们通过具体示例更深入地探讨实际问题。 解释够了吧? 是的,让我们这样做。

我们将使用Xcode Playground。 因此,随着我们的前进,请随时在操场上测试代码。 我们将从无约束的泛型开始,但是我们不会浪费时间,因为我们不能真正地对无约束的泛型做很多事情。

上面的参数化函数可以接受任何类型的输入。 我们可以将输入值复制到局部变量,然后从函数返回它。 我们也可以将函数传递给另一个函数。 这就是我们可以使用此不受约束的泛型函数所能做的事情。

因此,现在让我们看看受约束的泛型函数。 首先,我们将在不使用泛型的情况下进行常规实现。 然后,我们将使用泛型来排除共享功能并减少样板。 我们的示例将通过decodable协议从网络中获取数据并解码json响应。

我们将从https://jsonplaceholder.typicode.com/获取数据,其中包含用于测试的虚拟数据API。

通过仔细查看上面的函数,我们可以轻松地看到fetchPostsfetchComments函数有很多共同点。 它们之间的唯一区别在于不同的PostComment模型对象,这些对象符合我们传递给JSONDecoder的可解码协议。 因此,这是一个很好的地方,我们可以使用泛型来避免代码重复。

注意:我们正在从上述函数同步获取数据。 在生产代码中,建议异步获取数据,以避免在等待下载完成时冻结UI。

因此,让我们继续提取通用函数,我们可以轻松地重用它们而无需重复自己。

因此,使用泛型,我们已经能够提取两个功能之间的共享功能。 因此,使loadResources可重用。 我们将该函数限制为可解码协议,以帮助我们根据分别来自用户特定函数loadPostsloadComments通过完成处理程序传递的模型对象类型来解码json数据。 编译器将能够在运行时根据我们传递给完成处理程序的类型来推断参数类型。

在总结泛型之前,还有一件事是看一下泛型类型或数据类型 。 我们将实现一个通用类型,以执行与从网络中获取数据相同的操作,但是这次,我们将使用 结构 就像函数一样,结构也可以是泛型的

通过以上操作,我们设法减少了postResourcecommentResource实例,以描述资源所在的位置。 我们已经将网络部分完全分离出来了。 因此,使用这种方法,测试变得更加简单,因为我们可以轻松地测试该结构的实例以了解其是否完整形成。

从以上代码中,我们还有两个功能,一个功能同步执行资源加载,另一个功能异步执行操作。 基本上,除了使用URLSession异步API外,两者之间的区别是在异步函数中使用了注释关键字@escaping 。 这样做是为了确保完成处理程序转义方法的范围,因为我们正在处理异步请求。

因此,最后,我们已经能够解释如何在Swift中实现泛型函数和类型。 我知道现在您对自己今天学到的东西感到高兴。 是的,我们一起做。

但是,如果您有任何疑问或问题,请随时在下面发表评论。 您也可以在Twitter上给我留言。


您需要雇用顶尖的开发人员吗? 与Andela交谈以帮助您扩展规模
您是否想加快您作为开发人员的职业生涯? Andela目前正在招聘高级开发人员。 现在申请

Interesting Posts