Swift URL类
Swift URL类

Swift URL类

在 Swift 中,URL 类用于表示统一资源定位符(Uniform Resource Locator),它通常用于处理文件路径、网络资源路径等。通过 URL,可以轻松地访问、处理和修改文件和资源的路径,尤其在需要处理文件、下载文件、或是与网络交互时,URL 是非常常用的工具。

基本的 URL 操作

1、创建 URL 实例

创建一个基本的 URL 实例,可以使用 URL(string:) 方法:

if let url = URL(string: "https://www.fangjunyu.com") {
    print("URL 创建成功: \(url)")
} else {
    print("URL 创建失败")
}

如果 URL 不符合格式或者是无效的,URL(string:) 会返回 nil。因此,最好用 if let 解包处理这种情况。

2、访问文件系统

如果在本地文件系统中工作,可以用 URL(fileURLWithPath:):

// 本地文件URL
let fileURL = URL(fileURLWithPath: "/path/to/your/file.txt")
print(fileURL)

如果需要访问应用程序的沙盒目录,可以使用 FileManager 来获取路径:

// 获取应用程序的 Documents 目录
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
print(documentDirectory)  // 输出类似:file:///Users/yourname/Documents/

3、拼接URL路径

可以使用 appendingPathComponent 方法来将路径追加到现有 URL:

// 拼接路径
let fileURL = URL(fileURLWithPath: "/path/to/your")
let newFileURL = fileURL.appendingPathComponent("file.txt")
print(newFileURL)  // 输出:file:///path/to/your/file.txt

4、URL 组件(URLComponents)

使用 URLComponents可以更方便地管理和创建包含查询参数的 URL。例如:

var components = URLComponents()
components.scheme = "https"
components.host = "www.fangjunyu.com"
components.path = "/search"
components.queryItems = [
    URLQueryItem(name: "q", value: "Swift URL"),
    URLQueryItem(name: "lang", value: "en")
]

if let url = components.url {
    print("URL: \(url)")
} else {
    print("URL 创建失败")
}

这个代码会生成 URL https://www.fangjunyu.com/search?q=Swift%20URL&lang=en。

5、从 URL 中提取组件

如果已经有一个 URL,可以使用 URL 提供的属性来提取组件:

if let url = URL(string: "https://www.fangjunyu.com/path?query=swift#fragment") {
    print("Scheme: \(url.scheme ?? "")")         // 输出: https
    print("Host: \(url.host ?? "")")             // 输出: www.fangjunyu.com
    print("Path: \(url.path)")                   // 输出: /path
    print("Query: \(url.query ?? "")")           // 输出: query=swift
    print("Fragment: \(url.fragment ?? "")")     // 输出: fragment
}

也可以通过URLComponents进行解析

if let components = URLComponents(string: "https://www.fangjunyu.com/search?q=Swift%20URL&lang=en") {
    print("Scheme: \(components.scheme ?? "")")         // 输出: https
    print("Host: \(components.host ?? "")")             // 输出: www.fangjunyu.com
    print("Path: \(components.path)")                   // 输出: /search
    if let queryItems = components.queryItems {
        for item in queryItems {
            print("Query Item: \(item.name) = \(item.value ?? "")")
        }
    }
}

总体来讲,URLComponents 适合需要解析和修改 URL 的场景,而 URL 则适合直接表示资源和快速获取信息的场景。

6、文件路径和扩展名

可以通过 URL 获取文件路径的文件名或扩展名:

let fileURL = URL(fileURLWithPath: "/path/to/your/file.txt")
print(fileURL.lastPathComponent)  // 输出:file.txt
print(fileURL.pathExtension)     // 输出:txt

7、转换为字符串

如果想将 URL 转换为字符串表示,可以使用 absoluteString:

let url = URL(string: "https://www.fangjunyu.com")
print(url?.absoluteString ?? "无效URL")  // 输出:https://www.fangjunyu.com

8、加载和下载 URL 内容

使用 URLSession 从 URL 加载数据,比如从网络下载文件或数据:

let url = URL(string: "https://www.fangjunyu.com/file.zip")!
let task = URLSession.shared.downloadTask(with: url) { localURL, response, error in
    if let error = error {
        print("下载失败:\(error)")
    } else if let localURL = localURL {
        print("下载成功,文件保存到:\(localURL.path)")
    }
}
task.resume()

常用方法和属性

在 Swift 中,URL 类有很多方法和属性,可以用来获取 URL 的不同部分或执行与 URL 相关的操作。

1、.path

作用:返回 URL 的路径部分(不包括协议和主机部分)。

let url = URL(string: "https://www.fangjunyu.com/path/to/resource?query=value#fragment")
print(url?.path ?? "No path")  // 输出:/path/to/resource

2、.absoluteString

作用:返回 URL 的完整字符串表示,包括协议、主机、路径、查询等。

let url = URL(string: "https://www.fangjunyu.com/path/to/resource?query=value#fragment")
print(url?.absoluteString ?? "Invalid URL")  // 输出:https://www.fangjunyu.com/path/to/resource?query=value#fragment

3、.absoluteURL

作用:返回 URL 的绝对形式,通常与 .absoluteString 相似,但对于相对 URL 可能会有所不同。

let url = URL(string: "www.fangjunyu.com")
let absoluteURL = url?.absoluteURL
print(absoluteURL?.absoluteString ?? "Invalid URL")  // 输出:http://www.fangjunyu.com

4、.scheme

作用:返回 URL 的协议部分(例如,http、https、ftp 等)。

let url = URL(string: "https://www.fangjunyu.com")
print(url?.scheme ?? "No scheme")  // 输出:https

5、.host

作用:返回 URL 的主机部分(例如,www.fangjunyu.com)。

let url = URL(string: "https://www.fangjunyu.com/path/to/resource")
print(url?.host ?? "No host")  // 输出:www.fangjunyu.com

6、.port

作用:返回 URL 的端口号(如果有的话)。如果 URL 没有明确指定端口号,则返回 nil。

let url = URL(string: "https://www.fangjunyu.com:8080")
print(url?.port ?? "No port")  // 输出:8080

7、.pathExtension

作用:返回 URL 的文件扩展名部分(例如,.txt、.jpg、.html)。

let url = URL(string: "https://www.fangjunyu.com/file.txt")
print(url?.pathExtension ?? "No extension")  // 输出:txt

8、.lastPathComponent

作用:返回 URL 的最后一部分(通常是文件名),包括扩展名。

let url = URL(string: "https://www.fangjunyu.com/path/to/file.txt")
print(url?.lastPathComponent ?? "No last path component")  // 输出:file.txt

9、.deletingLastPathComponent

作用:返回删除 URL 最后一部分后的新 URL。例如,如果原始 URL 是 /path/to/file.txt,则返回 /path/to/。

let url = URL(string: "https://www.fangjunyu.com/path/to/file.txt")
let newURL = url?.deletingLastPathComponent()
print(newURL?.absoluteString ?? "No new URL")  // 输出:https://www.fangjunyu.com/path/to

10、.deletingPathExtension

作用:返回删除 URL 扩展名后的新 URL。例如,如果原始 URL 是 file.txt,则返回 file。

let url = URL(string: "https://www.fangjunyu.com/path/to/file.txt")
let newURL = url?.deletingPathExtension()
print(newURL?.absoluteString ?? "No new URL")  // 输出:https://www.fangjunyu.com/path/to/file

11、.query

作用:返回 URL 中的查询部分(例如,?query=value)。

let url = URL(string: "https://www.fangjunyu.com/path?query=value&other=value")
print(url?.query ?? "No query")  // 输出:query=value&other=value

12、.fragment

作用:返回 URL 中的片段部分(例如,#fragment)。

let url = URL(string: "https://www.fangjunyu.com/path#fragment")
print(url?.fragment ?? "No fragment")  // 输出:fragment

13、.user

作用:返回 URL 的用户信息部分(例如,username 或 username:password)。

let url = URL(string: "https://username:password@www.fangjunyu.com")
print(url?.user ?? "No user")  // 输出:username

14、.password

作用:返回 URL 中的密码部分(如果有的话)。

let url = URL(string: "https://username:password@www.fangjunyu.com")
print(url?.password ?? "No password")  // 输出:password

 15、.relativePath

作用:返回 URL 的相对路径部分。它类似于 .path,但主要用于相对 URL。

let url = URL(string: "https://www.fangjunyu.com/path/to/resource")
print(url?.relativePath ?? "No relative path")  // 输出:/path/to/resource

16、isFileURL

作用:返回一个布尔值,指示该 URL 是否是一个文件 URL(即以 file:// 协议开头的 URL)。

let url = URL(fileURLWithPath: "/path/to/file.txt")
print(url.isFileURL)  // 输出:true

17、.standardized

作用:返回标准化后的 URL。例如,它会解析出任何路径中的相对符号(如 ..)并将它们转换为绝对路径。

let url = URL(string: "https://www.fangjunyu.com/./path/../to/resource")
print(url?.standardized.absoluteString ?? "No standardized URL")  // 输出:https://www.fangjunyu.com/to/resource

18、.relative(to:)

作用:返回相对于指定基础 URL 的新 URL。通常用于创建相对 URL。

let baseURL = URL(string: "https://www.fangjunyu.com/")
let relativeURL = URL(string: "path/to/resource")
print(relativeURL?.relative(to: baseURL!)?.absoluteString ?? "No relative URL")  // 输出:https://www.fangjunyu.com/path/to/resource

URL构造方法

URL 类型的构造方法可以用来创建一个 URL 对象,表示一个资源的统一资源定位符(Uniform Resource Locator)。URL 类型在 Swift 中非常重要,它用于处理文件、网络资源等各种资源路径。

1、URL(string:)

用于从一个字符串创建一个 URL 对象,通常用来处理网页链接、网络资源等。

如果字符串不能被正确解析为有效的 URL,它将返回 nil。

if let url = URL(string: "https://www.example.com") {
    // 使用 url 对象
    print(url)
}

注意:URL(string:) 主要用于网络 URL,它不会解析文件路径。

2、URL(fileURLWithPath:)

用于创建指向本地文件系统中路径的 URL 对象。

filePath 参数通常是一个本地文件路径的字符串(例如,文件系统中的路径)。

let fileURL = URL(fileURLWithPath: "/Users/username/Documents/file.txt")
print(fileURL)

这个构造方法默认假设路径是本地文件系统中的路径。如果需要访问某个文件,可以使用这个方法来生成文件的 URL。

3、URL(fileURLWithPath: isDirectory:)

与 URL(fileURLWithPath:) 类似,但它额外有一个 isDirectory 参数,用于指示该路径是否指向一个目录。

这个方法在知道某个路径指向目录时特别有用。

let directoryURL = URL(fileURLWithPath: "/Users/username/Documents", isDirectory: true)

4、URL(fileURLWithPath: relativeTo:)

用于根据一个相对路径和一个基准路径来创建 URL 对象。

如果提供的路径是相对路径,那么它会根据 relativeTo 参数来生成完整的路径。

let baseURL = URL(fileURLWithPath: "/Users/username")
let relativeURL = URL(fileURLWithPath: "Documents/file.txt", relativeTo: baseURL)
print(relativeURL)  // 输出:/Users/username/Documents/file.txt

5、URL(resourceSpecifier:)

用于创建一个资源定位符(通常是网络 URL)。

这种方法较少使用,通常由一些特定的 URL 扩展功能支持。

6、URL(string:relativeTo:)

用于根据一个相对 URL 和基准 URL 来创建一个新的 URL 对象。

let baseURL = URL(string: "https://www.example.com")!
let relativeURL = URL(string: "about")!
let fullURL = relativeURL.relative(to: baseURL)
print(fullURL)  // 输出:https://www.example.com/about

7、init?(fileURLWithPath: isDirectory: relativeTo:)

可以创建一个文件 URL,判断是否是目录,并且支持相对路径解析。

URL 构造方法的选择依据需求:是处理网络资源、还是本地文件系统资源,或者是文件路径相对与其他路径的组合。

常用的方法有:URL(string:)(用于网络资源)和 URL(fileURLWithPath:)(用于文件路径)。

URL实现用途

在 Swift 中,URL 实例可以用来表示和操作网络地址、文件路径等多种资源。通过 URL,可以处理和构建网络请求、访问本地文件、解析 URL 内容等。以下是 URL 实例可以实现的多种用途:

1、发起网络请求

URL 是网络请求的基础。它与 URLSession 配合可以进行各种 HTTP 请求,比如获取 JSON 数据、下载文件、上传内容等:

if let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1") {
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let data = data, let jsonResponse = try? JSONSerialization.jsonObject(with: data) {
            print("JSON 响应: \(jsonResponse)")
        }
    }
    task.resume()  // 开始任务
}

此示例中,URL 被用于表示目标 API 地址,通过 URLSession 发起网络请求。

2、下载和上传文件

URL 可以代表一个资源的地址,通过 URLSession 的 downloadTask 和 uploadTask,可以实现文件下载和上传:

下载

if let url = URL(string: "https://fangjunyu.com/image.png") {
    let task = URLSession.shared.downloadTask(with: url) { localURL, response, error in
        if let localURL = localURL {
            print("文件已下载到本地路径: \(localURL.path)")
        }
    }
    task.resume()
}

上传

let uploadURL = URL(string: "https://fangjunyu.com/upload")!
var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let fileURL = URL(fileURLWithPath: "/path/to/file.txt")

let task = URLSession.shared.uploadTask(with: request, fromFile: fileURL) { data, response, error in
    if let error = error {
        print("上传出错: \(error)")
    } else {
        print("上传成功")
    }
}
task.resume()

3、解析和构建 URL 组件

URLComponents 可以通过 URL 来构建和分解 URL,提取其结构化信息,如 scheme、host、path、query 参数等,非常适合构建带查询参数的 URL:

var components = URLComponents(string: "https://fangjunyu.com/search")!
components.queryItems = [URLQueryItem(name: "q", value: "Swift")]
if let url = components.url {
    print("构建的 URL: \(url)")
}

4、访问本地文件

URL 支持本地文件系统路径,可以表示文件地址,并与 FileManager 配合用于文件操作(如创建、移动、删除、读取文件等):

let fileURL = URL(fileURLWithPath: "/path/to/file.txt")

do {
    let content = try String(contentsOf: fileURL, encoding: .utf8)
    print("文件内容: \(content)")
} catch {
    print("文件读取出错: \(error)")
}

5、多媒体资源加载

URL 可以被用来加载图片、视频等多媒体资源,配合 UIImageView、AVPlayer 等 UIKit 组件,可以从网络或本地加载多媒体内容:

if let imageUrl = URL(string: "https://fangjunyu.com/image.jpg") {
    URLSession.shared.dataTask(with: imageUrl) { data, response, error in
        if let data = data, let image = UIImage(data: data) {
            DispatchQueue.main.async {
                imageView.image = image
            }
        }
    }.resume()
}

6、处理和生成 URL Schemes

URL 还可以处理自定义的 URL schemes,用于在应用间跳转,比如在 App 内使用 urlScheme://path 进行页面跳转。

具体内容参考《SwiftUi配置深层链接

总结

URL 是一个非常灵活的工具,能有效地帮助我们处理网络资源、文件系统、查询参数等多种场景,增强应用与资源之间的交互能力。

相关文章

SwiftUi配置深层链接:https://fangjunyu.com/2025/02/08/swiftui%e9%85%8d%e7%bd%ae%e6%b7%b1%e5%b1%82%e9%93%be%e6%8e%a5/

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

发表回复

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