Swift 常见的 URL 快捷访问方法
Swift 常见的 URL 快捷访问方法

Swift 常见的 URL 快捷访问方法

在Swift中,可以通过URL.documentsDirectory访问文档目录,此处之外,还有其他的URL快捷访问方法。

这些属性和方法是 Swift 的 URL 类型提供的快捷访问方法(从 macOS 13.0 和 iOS 16.0 开始引入),用于获取常用的系统目录。它们为常用的用户文件夹(如文档、桌面、缓存等)提供了方便的访问方式,而不需要通过 FileManager 手动查找。

常见的 URL 快捷访问方法

currentDirectory():获取当前工作目录。

homeDirectory:获取当前用户的主目录(~)。

temporaryDirectory:获取当前用户的临时目录。

documentsDirectory:获取当前用户的文档目录(~/Documents)。

desktopDirectory:获取当前用户的桌面目录(~/Desktop)。

downloadsDirectory:获取当前用户的下载目录(~/Downloads)。

cachesDirectory:获取当前用户的缓存目录(~/Library/Caches)。

moviesDirectory、musicDirectory、picturesDirectory:分别对应视频、音乐、图片目录。

sharedPublicDirectory:获取用户的公共共享目录(~/Public)。

trashDirectory(macOS 专用):获取用户的垃圾桶目录(~/.Trash)。

自定义目录方法

homeDirectory(forUser:):获取指定用户的主目录。

init(for:in:appropriateFor:create:):根据 FileManager.SearchPathDirectory 和 SearchPathDomainMask 初始化 URL,允许自定义目录的选择和创建。

使用示例

这些 URL 快捷访问方法提供了便捷的方式来获取常用的目录 URL,而不必显式地通过 FileManager。在 Swift 中,系统目录路径可以直接通过这些 URL 类型的静态属性获取,而这些属性其实是基于 FileManager 封装的。

// 获取文档目录 URL
let documentsURL = URL.documentsDirectory

// 获取临时目录 URL
let tempURL = URL.temporaryDirectory

// 获取主目录 URL
let homeURL = URL.homeDirectory

// 获取桌面目录 URL
let desktopURL = URL.desktopDirectory

print("Documents Directory: \(documentsURL)")
print("Temporary Directory: \(tempURL)")
print("Home Directory: \(homeURL)")
print("Desktop Directory: \(desktopURL)")

if let text =
"""
Some name
""".data(using: .utf8) {
    do {
        try text.write(to: documentsURL.appending(path: "text.txt"))
    } catch {
        print("写入失败")
    }
}

为什么不需要显式调用 FileManager?

这些快捷属性实际上是 URL 类型的静态属性,由 Swift 提供的 URL 访问 API 封装。它们在内部会通过系统 API 获取目录路径,简化了代码书写,不需要显式调用 FileManager 来查找目录。Swift 的 URL 访问属性在底层实际上依赖于 FileManager 来提供正确的系统路径,只不过这种封装让我们不必直接与 FileManager 交互,从而使代码更加简洁和易读。

与 FileManager 的关系

这些快捷访问属性与 FileManager 是有关系的。FileManager 提供了访问系统路径的基础功能,例如 urls(for:in:) 和 homeDirectoryForCurrentUser 等方法。这些 URL 的静态属性利用了 FileManager 的功能,但进一步抽象和简化了目录的查找和使用流程。因此,底层还是基于 FileManager 进行路径查找,只是 URL 提供了更方便的 API。

FileManager 对应方法

在旧版本的系统中(或没有快捷属性时),可以通过 FileManager 这样访问相同的路径:

let fileManager = FileManager.default
if let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
    print("Documents Directory: \(documentsURL)")
}

新的 URL 静态属性相当于省去了 FileManager 的显式调用,简化了常用路径的获取流程。

Foundation框架URL扩展代码

extension URL {

    public static func currentDirectory() -> URL

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var homeDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var temporaryDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var cachesDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var applicationDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var libraryDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var userDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var documentsDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var desktopDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var applicationSupportDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var downloadsDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var moviesDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var musicDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var picturesDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static var sharedPublicDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, *)
    @available(tvOS, unavailable)
    @available(watchOS, unavailable)
    public static var trashDirectory: URL { get }

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public static func homeDirectory(forUser user: String) -> URL?

    @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
    public init(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, appropriateFor url: URL? = nil, create shouldCreate: Bool = false) throws
}

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注