TinyExtension:增强固定的URL初始化

此文章同时提供中文版本: TinyExtension:优化固定URL创建

我相信当今大多数应用程序都使用网络请求,因为网络使一切变为可能。 因此, URL类应该是每个人都熟悉的。 我相信每个人都会有直接用固定字符串创建URL的经验。 毕竟,第一个请求的url地址必须直接写在代码中。 因此,我们可以像这样在我们的应用中声明第一个网络请求地址:

 让媒介= URL(字符串:“ https://medium.com/@GalvinLi”) 

很好,但是使用起来可能很不方便,因为URL(string:)方法返回URL? ,并且每次使用时都需要将其拆开。 URL(string:)设计为返回Optional对象,因为参数字符串不一定是有效地址,但是我们可以保证代码中固定的地址中格式的正确性,因此可以强制展开:

 让medium = URL(字符串:“ https://medium.com/@GalvinLi”)! 

强制拆包具有一个特征,即如果直接使用它,它就像展开的对象一样工作。 但是,当您将其分配给另一个对象时,对象类型将更改回Optional对象。 因此,稳定的方法是直接将其声明为非Optional对象:

 让媒介:URL = URL(字符串:“ https://medium.com/@GalvinLi”)! 

现在,我们可以轻松使用此URL对象。

减少强制展开

当定义了许多URL对象时,将有很多强制展开。 在现实世界的项目中,作为一种良好的编程习惯,必须减少强制展开。 当我们习惯于对URL(string:)进行强制解包时,可以强制解开服务器返回的某些url地址,特别是对于经验不足的程序员而言。 为了解决这个问题,我们实际上可以通过一个简单的extension实现它:

extension仅添加了一个返回URL的初始化方法。 但是这里传递的参数有些不同,不是常规String而是StaticString 。 这是Swift标准库提供的一种类型,某些人可能不知道,所以让我们看一下文档中的定义:

简而言之, StaticString定义了一个在编译时就已知的字符串,即在我们的代码中不接受任何变量的固定字符串。 这是区分需要手动处理的URL地址和代码中的固定URL的好方法。 使用它的方法非常简单:

 让媒介= URL(staticString:“ https://medium.com/@GalvinLi”) 

消除力解开可以使代码更干净,更安全。

更好的实施

StaticString使代码更安全,但我们可以使其更好。 对于编译器, "https://medium.com"是一个字符串,而URL()是一个url对象。 但是对于我们来说,以https开头的字符串已经可以表示url对象。 为了使编译器也知道这一点,我们需要添加另一个extension

ExpressibleByStringLiteral是用于初始化的protocol ,专门用于=初始化。 当然,这仍然是用于StaticString初始化而不是String ,现在我们可以使用=来直接初始化url,如下所示:

 让媒介:URL =“ https://medium.com/@GalvinLi” 

因为=之后只有一个字符串,所以我们必须声明对象的类型,以便编译器知道该字符串实际上应该初始化为URL对象。 完成所有这些操作后,我们对固定url的初始化变得更加简单和安全。