译自 www.hackingwithswift.com/books/ios-s…
更多内容欢迎关注公众号 「Swift花园」
当我们使用 Image 视图时,SwiftUI 知道从你的 app 的 asset catalog 里寻找图片,甚至它能够自动加载适配当前屏幕参数的版本 —— 即 @2x 和 @3x 。
对于其他数据,例如文本文件,我们需要多做一些工作,对于特别的数据格式 XML 或者 JSON 也适用。下面要讨论的方法适用于任何文件类型。
当 Xcode 构建你的 iOS app 时,它创建了一种叫 “bundle” 的东西,这在所有 Apple 的 平台上都是如此,包括 macOS。这个结果让系统可以在一个地方为一个 app 存放所有的文件 —— 所有的二进制文件(我们写的 swift 代码编译后的产物),所有的 artwork ,任何我们用到的额外的文件,我们的 Info.plist 文件,等等,全在一个地方。
随着你的技能精确,将来你会知道如何在一个 app 里引入多个 bundle ,这使得你可以写一些诸如 Siri 扩展, iMessage apps,watchOS apps 等类型的应用,所有的资源都在单一的 iOS app bundle 里,我们称为 main bundle 。
需要了解这些的原因在于我们经常需要从 bundle 中加载文件。这里头用到了一种新的数据类型,叫URL,里面存的东西跟你想的一模一:一个像 www.hackingwithswift.com 这样的 URL 。URL 的能力远不止存储 web 地址 —— 它们还能用来存在文件位置。
如果我们想要借助 URL 读取我们的 main app bundle 里的一个文件,我们用 Bundle.main.url()。如果文件存在,它会被返回给我们,否则的话我们得到 nil, 因此这是一个可选的 URL。所以我们需要解包:
if let fileURL = Bundle.main.url(forResource: "some-file", withExtension: "txt") {
// we found the file in our bundle!
}URL 里有些什么并不重要,因为 iOS 其实用了一些无法被猜测的路径 —— 因为我们的 app 实际上是处于”沙盒“环境中,我们不应该试图在外部使用这些资源。
一旦有了 URL ,我们可以把里面的内容载进一个字符串,用到一个特定的字符串构造器:String(contentsOf:)。给它一个文件 URL ,如果文件能够加载,则返回一个包含文件内容的字符串。如果文件无法加载,则会抛出一个错误。因此,你需要用到 try 或者try? 像这样:
if let fileContents = try? String(contentsOf: fileURL) {
// we loaded the file into a string!
}一旦你拿到文件内容的字符串,你可以拿它做任何事情 —— 它就是一个常规字符串。
我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~