我扩展了Apple的URLRequest结构:
extension URLRequest {
mutating func addJSONContentTypeHeader() -> URLRequest {
setValue("application/json", forHTTPHeaderField: "Content-Type")
return self
}
mutating func addAuthHeader(withT t: String) -> URLRequest {
setValue(t, forHTTPHeaderField: "Auth")
return self
}
}
我可以使用这些方法而不会出现诸如以下问题:
[...]
return urlRequest.addJSONContentTypeHeader()
但是,不可能像下面的示例中那样生成类似构建器的模式,并且会从标题返回错误消息:
return urlRequest.addJSONContentTypeHeader().addAuthHeader(withT: token) <--- error:
函数调用返回不可变的值。
但是,我确实将扩展方法标记为“变异”。避免这种情况的唯一方法是创建中间成员:
let mutableRequest = urlRequest.addJSONContentTypeHeader()
return mutableRequest.addAuthHeader(withT: token)
但是,它肯定不如构建器模式一线解决方案那么优雅。为什么swiftc不允许我那样写?
答案 0 :(得分:1)
是的,这很明显,因为如果您看过documentation,那么您会看到URLRequest
是带有初始化struct
的{{1}}也是{{1 }}导致返回原始请求的不变副本。 URL
表示您正在修改调用对象,但不会返回“可变”对象!
这是它给出错误的原因。好吧,仍然,如果您希望使用相同的方式,那么我有代码的修改版本。
struct
用法:
mutating