Swift 当结构扩展返回变异的self时,无法对不可变值使用变异成员
我已经扩展了苹果的URLRequest结构:Swift 当结构扩展返回变异的self时,无法对不可变值使用变异成员,swift,struct,Swift,Struct,我已经扩展了苹果的URLRequest结构: extension URLRequest { mutating func addJSONContentTypeHeader() -> URLRequest { setValue("application/json", forHTTPHeaderField: "Content-Type") return self } mutating func addAuthHeader(withT t: S
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:
但是,它肯定没有构建器模式的单线解决方案那么优雅。为什么swiftc不允许我这样写呢?是的,这很明显,因为如果你看了,你会发现
URLRequest
是一个struct
,初始值为URL
,也是struct
会导致返回原始请求的不可变副本<代码>变异表示您正在修改调用对象,但它不会返回“可变”对象
这就是它产生错误的原因。好吧,如果你想用同样的方法,那么我有你的代码的修改版本
extension URLRequest {
func addJSONContentTypeHeader() -> URLRequest {
var newRequest = self
newRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
return newRequest
}
func addAuthHeader(withT t: String) -> URLRequest {
var newRequest = self
newRequest.setValue(t, forHTTPHeaderField: "Auth")
return newRequest
}
}
用法:
extension URLRequest {
func addJSONContentTypeHeader() -> URLRequest {
var newRequest = self
newRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
return newRequest
}
func addAuthHeader(withT t: String) -> URLRequest {
var newRequest = self
newRequest.setValue(t, forHTTPHeaderField: "Auth")
return newRequest
}
}
request.addJSONContentTypeHeader().addAuthHeader(withT: "adfakljdhfkjah")