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())
}