我一直在浏览Alamofire
源代码,而且有一段代码片段,我无法理解它是如何工作的原因。
if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty {
let percentEncodedQuery = (urlComponents.percentEncodedQuery.map { $0 + "&" } ?? "") + query(parameters)
urlComponents.percentEncodedQuery = percentEncodedQuery
urlRequest.url = urlComponents.url
}
这是urlComponents.percentEncodedQuery.map { $0 + "&" } ?? "")
我不明白它是如何工作的以及为什么需要它。
然后我写了我的片段:
import Foundation
let a: String = "hello world"
a.map { $0 + "&" } //error: binary operator '+' cannot be applied to operands of type 'Character' and 'String'
print(a)
但它在map
方法上出错。
为什么这不起作用,urlComponents.percentEncodedQuery.map { $0 + "&" } ?? "")
的目的是什么?
答案 0 :(得分:3)
它不是map
超过String
,而是map
超过String?
(Optional<String>
)。一种完全不同的方法。
请参阅Optional.map
当此Optional实例不为nil时,计算给定的闭包,将未包装的值作为参数传递。
基本上,代码可以重写为:
(urlComponents.percentEncodedQuery?.appending("&") ?? "") + query(parameters)