在你的 Swift 应用中建立或修改 URL

做者:codingexplorer,原文连接,原文日期:2018-07-18 译者:Damonwong;校对:numbbbbbBigNerdCoding;定稿:Forelaxhtml

译者注: 此篇文章之前咱们曾经翻译过,原文做者在今年对这篇文章进行了更新,咱们也对更新后的文章进行了翻译并再次发布。ios

对于大部分应用来讲,都须要访问一些文件资源。这些文件资源可能在你的应用安装包中,或者在文件系统内,亦或者在某个网站服务器上。你须要用某种方法将它们体如今代码中。对于苹果平台而言,你主要有两种选择,用字符串或者 URLgit

若是你使用过浏览器的地址栏或者在终端中输入过地址,你可能会选择使用字符串,毕竟,在这些地方你只能输入字符串。虽然在 CocoaCocoa Touch SDKs 中许多旧的 API 同时采用 URL 和字符串 (对于这些 API 来讲,这些字符串一般被称为 "path") 做为参数,可是愈来愈多的 API 倾向于只能用 URL 对象。相比较于字符串路径来讲,URL 对象有更多的优点,最明显的优点就是你能够直接经过属性访问 URL 的不一样的部分,而不须要本身编写一个解析组件来解析路径字符串的不一样部分。github

紧跟个人步伐,接下来咱们学习如何在 Swift 应用中建立和使用 URL 对象。swift

在 Swift 中建立一个 URL 对象

在 Swift 中有好几个构造器和工厂方法可用于建立 URL 对象,下面我要讲一些更有用的初始化方法。浏览器

init?(string URLString: String)

这个是普通的,也是最经常使用的初始化方法。将一个用于表示 URL 的 Swift 字符串转变成一个 URL 对象。但并非全部的字符串均可以有效的表示一个 URL,因此这是一个可失败构造器。因为有些字符不能在 URL 中使用,所以须要进行 URL 编码,将这些不能使用的字符转化为能够在 URL 中发送的编码。我我的见过最多的是 %20,也就是“空格”字符。这个构造器须要有效的字符,它不会为你进行 URL 编码转化。若是字符串中包含没法转换为有效 URL 的字符或者内容,构造器将会返回 nil服务器

let NSHipster = URL(string: "http://nshipster.com/") //返回一个有效的 URL
let invalidURL = URL(string: "www.example.com/This is a sentence") //返回 nil
复制代码

这个构造器实际上是下面这个构造器的一个便利构造器。app

init?(string: String, relativeTo: URL?)

这是一个指定构造器。和上面的构造器同样,也是一个可失败的构造器,并且须要一个相似 URL 的 Swift 字符串和一个可选的 baseURL 对象,这个 baseURL 自己也是一个 URL 对象。若是 baseURLnil,那么内部会像第一个构造器同样,根据提供的 URL 字符串生成一个 URL 对象。学习

let NSHipsterTwo = URL(string: "http://nshipster.com/", relativeTo: nil) //返回一个有效的 NSHipster URL
let article = URL(string: "ios9/", relativeTo: NSHipster) //返回 "http://nshipster.com/ios9/" URL 
复制代码

init(fileURLWithPath: String, isDirectory: Bool)

该构造方法与上一个构造方法相似,可是他的字符串参数指向的是本地文件或者目录。我不太肯定为何会有一个本地文件的特殊版本,我猜有多是作了一些优化(至少须要是文件 scheme 开头,而不该该是 http 之类的)。虽然有一个不须要传 isDirectory 参数的构造器,但若是你知道它是不是一个目录时,苹果建议你使用这个这个方法。在我看来,有可能另一个构造器在内部本身判断了输入参数是不是一个目录,而这个方法经过传入参数避免了检查。优化

init(fileURLWithPath: String, isDirectory: Bool, relativeTo: URL?)

这是在 iOS 9 中新加入的方法,这与前一个相似,但新增了 relativeToURL 参数。和以前的构造器同样,它将返回一个将路径附加到 baseURLURL 对象。当你须要为了某个事情重复访问某个目录下的不一样文件时,可使用这个初始化方法。你能够将文件所在的目录做为 baseURL,而后只须要一个文件名做为 Swift 字符串路径来建立 URL 对象。

将 URL 转回 Swift 字符串

有时你须要将 URL 对象转回 Swift 字符串,特别是在处理旧的 API 或者向用户展现情形下。值得庆幸的是,URL 提供了一个简单的只读属性来解决这个问题: absoluteString。只须要在你的 URL 对象调用该属性便可:

let articleString = article?.absoluteString
// articleString 如今包含 = 的值是 "http://nshipster.com/ios9/"
复制代码

在这个例子中,咱们使用了 relativeToURL 版本的构造器定义了一个 article 常量,将其解析为从 scheme 开始的完整 URL (在这种状况下是一个路径)。若是这个 URL 上有文件拓展名,query 或者 fragment,它依旧能够被解析。原来的 article 对象是由一个可失败构造器返回的,这就是为何那儿有一个 Swift 可选访问。

修改一个 URL 对象

咱们接下来所说的这些方法,每个都会在请求修改完成时根据调用的 URL 对象返回一个新的 URL 对象。它们不会更改调用它们的 URL 对象。

func appendingPathComponent(String, isDirectory: Bool) -> URL

这个方法能够为你的 URL 添加更多的路径组件,好比当你要添加一个文件到你所在的目录(存储在这个方法调用返回的 URL)时,这个方法就能够派上用处。像咱们前面提到的那个初始化方法同样,这个方法也有一个没有 isDirectory 参数的版本,可是不管你是否知道它是否是一个目录,都更推荐你使用这个方法来确保元数据能够存储在正确的目录下。

func deletingLastPathComponent() -> URL

这个方法将会返回删除了最后一个路径组件的新 URL 对象。这方法适用于 URL 的路径部分,URL 的其余部分不受影响,好比域名。因此咱们能够这样子作:

let articleTwo = NSHipster?.appendingPathComponent("ios9", isDirectory: true)
//articleTwo 如今包含的 URL 字符是 "http://nshipster.com/ios9/"

let deletePathComp = articleTwo?.deletingLastPathComponent
//deletePathComp 如今包含的 URL 字符是 "http://nshipster.com/"
复制代码

译者注: 在 Swift 4.2 以前,deletingLastPathComponent 是一个属性,所以在调用时不用加括号。在 4.2 版本中,deletingLastPathComponent 变成了方法 所以若是你在 4.2 上运行上面一段代码,须要在 articleTwo?.deletingLastPathComponent 最后加一个括号才能正确运行

若是没有路径信息,可能有点儿奇怪。为了好玩,我链式调用了几回 URLByDeletingLastPathComponent,最后只是添加了 “../”,相似于在命令行(cd ..)中上一个目录。

固然还有几种修改方法和属性,但这些多是最经常使用的。

总结

若是你对 URL 格式规范感兴趣的话,能够去查看苹果的 URL 参考文档中,关于如何处理 URL 这部分说起到的 RFC 文档。用于初始化的字符串必须符合 RFC 2396,而且 URL 将会根据 RFC 1738RFC 1808 被解析。这些规范内容不少,但你能找到全部可能关于 URL,URI 等的信息。

若是你完整查阅 URL 的文档的话,还能够看到它拥有 baseURLhostqueryfragment 等等很是多的属性,全部这些属性都能在 Apple 文档中查询到。不过对我来讲,平常使用最多的仍是 absoluteString,偶尔也会用到 pathExtension

我但愿你能以为这篇文章对你有所帮助。若是你以为有用,请不要犹豫,在 Twitter 或者其余社交媒体上分享这篇文章。固然,若是你有任何疑问,请随时经过 联系页面 或者 Twitter@CodingExplorer 与我联系。我会尽量的帮助你。谢谢。

参考

URL Class Reference – Apple Inc.

本文由 SwiftGG 翻译组翻译,已经得到做者翻译受权,最新文章请访问 swift.gg

相关文章
相关标签/搜索