MediaType

概述

MediaType 是一个库,可用于以类型安全的方式创建媒体类型

主要用于 – 虽然不限于 – 服务器端 Swift 应用程序。

创建媒体类型

媒体类型由 MediaType Swift 类型表示。

您可以使用其中一种可能的 case 以类型安全的方式创建媒体类型。您也可以简单地使用字符串字面量创建媒体类型实例。

let mediaType: MediaType = "application/json" // is equivalent to
MediaType.application(.json())

还可以从字符串变量创建 MediaType 实例,如下例所示。

let rawMediaType = "application/json"
let mediaType = MediaType(rawValue: rawMediaType)

后缀和参数

媒体类型的 Suffix (后缀)和 Parameters (参数)通过字符串字面量和 MediaType case 均受支持。

let mediaType: MediaType = "application/atom; charset=utf-8" // is equivalent to
MediaType.application(.atom(nil, ["charset": "utf-8"]))

let mediaType: MediaType = "application/atom+xml" // is equivalent to
MediaType.application(.atom(.xml))

let mediaType: MediaType = "application/atom+xml; charset=utf-8" // is equivalent to
MediaType.application(.atom(.xml, ["charset": "utf-8"]))

您可以使用字符串字面量语法,或者使用特定媒体类型的 other case 来创建媒体类型树。

let mediaType: MediaType = "application/vnd.efi.img" // is equivalent to
MediaType.application(.other("vnd.efi.img"))

未注册的媒体类型

使用此库,您可以创建所有已注册的媒体类型。该库功能足够强大,可以允许您创建几乎任何媒体类型,即使是注册的类型。以下是一些例子:

let image: MediaType = "image/svg+gzip" // is equivalent to
MediaType.image(.svg(.gzip))

let application: MediaType = "application/myApp+json" // is equivalent to
MediaType.application(.other("myApp", .json))

使用媒体类型

您可以使用常规的 switch 语句来测试媒体类型并访问其组件。以下示例显示了处理媒体类型的各种方式。

func isSupported(_ mediaType: MediaType) -> Bool {
  switch mediaType {
  case .application(.json(_, _)): return true
  case .application(.atom("xml", _)): return true
  case .application(let subtype):
    switch subtype {
    case .xml(_, _): return true
    default: return false
    }
  default: return false
  }
}

isSupported("application/json") // Returns: true
isSupported("application/json+xml") // Returns: true
isSupported("application/json;charset=utf-8") // Returns: true
isSupported("application/json+xml;charset=utf-8") // Returns: true

isSupported("application/atom+xml") // Returns: true
isSupported("application/atom+xml;charset=utf-8") // Returns: true
isSupported("application/atom") // Returns: false
isSupported("application/atom;charset=utf-8") // Returns: false

字符串转换

由于 MediaType 符合 CustomStringConvertible 协议,因此将实例转换为字符串非常简单。

您可以调用 MediaType/description 计算属性,或者简单地将实例嵌入到插值字符串中。

例如,您可以从一个虚构的商店请求 JSON 格式的可用产品列表。

var request = URLRequest(url: URL(string: "https://example-store.com/products")!)
let contentType: MediaType = "application/json"

// The following two statements are equivalent
request.setValue("Content-Type", forHTTPHeaderField: "\(contentType)")
request.setValue("Content-Type", forHTTPHeaderField: contentType.description)

let (_, response) = try await URLSession.shared.data(for: request)

媒体类型是 Hashable

这意味着您可以在集合或字典中使用 MediaType。例如,您可以像这样定义您的应用程序支持的图像类型:

let supportedImages: Set<MediaType> = ["image/png", "image/gif", "image/jpeg"]

比较媒体类型

您还可以使用 MediaType/==(lhs:rhs:) 运算符比较媒体类型的相等性。

func canHandle(response: URLResponse) -> Bool {
  guard let mimeType = response.mimeType else { return false }
  let mediaType = MediaType(rawValue: mimeType)
  return mediaType == .application(.json())
}