Swift 当结构扩展返回变异的self时,无法对不可变值使用变异成员

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

我已经扩展了苹果的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:

但是,它肯定没有构建器模式的单线解决方案那么优雅。为什么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")