当结构扩展返回变异的自身时,不能对不可变的值使用变异成员

时间:2018-11-05 10:45:35

标签: swift struct

我扩展了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不允许我那样写?

1 个答案:

答案 0 :(得分:1)

是的,这很明显,因为如果您看过documentation,那么您会看到URLRequest是带有初始化struct的{​​{1}}也是{{1 }}导致返回原始请求的不变副本。 URL表示您正在修改调用对象,但不会返回“可变”对象!

这是它给出错误的原因。好吧,仍然,如果您希望使用相同的方式,那么我有代码的修改版本。

struct
  

用法:

mutating