内容简介:作者:codingexplorer,译者:译者注:
作者:codingexplorer, 原文链接 ,原文日期:2018-07-18
译者: Damonwong ;校对: numbbbbb , BigNerdCoding ;定稿: Forelax
译者注:
此篇文章以前我们曾经翻译过,原文作者在今年对这篇文章进行了更新,我们也对更新后的文章进行了翻译并再次发布。
对于大部分应用来说,都需要访问一些文件资源。这些文件资源可能在你的应用安装包中,或者在文件系统内,亦或者在某个网站服务器上。你需要用某种方法将它们体现在代码中。对于苹果平台而言,你主要有两种选择,用字符串或者 URL
。
如果你使用过浏览器的地址栏或者在终端中输入过地址,你可能会选择使用字符串,毕竟,在这些地方你只能输入字符串。虽然在 Cocoa
和 Cocoa Touch
SDKs 中许多旧的 API 同时采用 URL
和字符串 (对于这些 API 来说,这些字符串通常被称为 “path”) 作为参数,但是越来越多的 API 倾向于只能用 URL
对象。相比较于字符串路径来说, URL
对象有更多的优势,最明显的优势就是你可以直接通过属性访问 URL
的不同的部分,而不需要自己编写一个解析组件来解析路径字符串的不同部分。
紧跟我的步伐,接下来我们学习如何在 Swift 应用中创建和使用 URL
对象。
在 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
这个构造器其实是下面这个构造器的一个便利构造器。
init?(string: String, relativeTo: URL?)
这是一个指定构造器。和上面的构造器一样,也是一个可失败的构造器,而且需要一个类似 URL
的 Swift 字符串和一个可选的 baseURL
对象,这个 baseURL
本身也是一个 URL
对象。如果 baseURL
为 nil
,那么内部会像第一个构造器一样,根据提供的 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
参数。和之前的构造器一样,它将返回一个将路径附加到 baseURL
的 URL
对象。当你需要为了某个事情重复访问某个目录下的不同文件时,可以使用这个初始化方法。你可以将文件所在的目录作为 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 1738
和 RFC 1808
被解析。这些规范内容很多,但你能找到所有可能关于 URL,URI 等的信息。
如果你完整查阅 URL
的文档的话,还可以看到它拥有 baseURL
, host
, query
, fragment
等等非常多的属性,所有这些属性都能在 Apple 文档中查询到。不过对我来说,日常使用最多的还是 absoluteString
,偶尔也会用到 pathExtension
我希望你能觉得这篇文章对你有所帮助。如果你觉得有用,请不要犹豫,在 Twitter 或者其他社交媒体上分享这篇文章。当然,如果你有任何疑问,请随时通过 联系页面 或者 Twitter@CodingExplorer 与我联系。我会尽可能的帮助你。谢谢。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Git应用详解第二讲:Git删除、修改、撤销操作
- Ionic+Angular 开发移动应用六:第三方、数据交互、修改图标
- 不修改模板的前提下修改VisualState中的某些值
- 修改Git已提交的的Author和EMail(批量修改脚本)
- ViewGroup 默认顺序绘制子 View,如何修改?什么场景需要修改绘制顺序?
- Per.js 史上最大修改版本,2.1 版本更新,修改 5 项功能
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
史蒂夫·乔布斯传
[美] 沃尔特·艾萨克森 / 管延圻、魏群、余倩、赵萌萌、汤崧 / 中信出版社 / 2011-10-24 / 68.00元
这本乔布斯唯一授权的官方传记,在2011年上半年由美国出版商西蒙舒斯特对外发布出版消息以来,备受全球媒体和业界瞩目,这本书的全球出版日期最终确定为2011年11月21日,简体中文版也将同步上市。 两年多的时间,与乔布斯40多次的面对面倾谈,以及与乔布斯一百多个家庭成员、 朋友、竞争对手、同事的不受限的采访,造就了这本独家传记。 尽管乔布斯给予本书的采访和创作全面的配合,但他对内容从不干......一起来看看 《史蒂夫·乔布斯传》 这本书的介绍吧!