Нельзя использовать мутирующий член в неизменяемом значении, когда расширение структуры возвращает мутировавшую себя - PullRequest
0 голосов
/ 05 ноября 2018

Я расширил структуру URLRequest от Apple:

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
    }
}

Я могу использовать эти методы без проблем, таких как, например ::100100

[...]
return urlRequest.addJSONContentTypeHeader()

Однако шаблон, подобный построителю, как в следующем примере, невозможен и возвращает сообщение об ошибке из заголовка:

return urlRequest.addJSONContentTypeHeader().addAuthHeader(withT: token) <--- error:

Вызов функции возвращает неизменное значение.

Однако я пометил методы расширения как "мутирующие". Единственный способ обойти это создание промежуточных элементов:

let mutableRequest = urlRequest.addJSONContentTypeHeader()
return mutableRequest.addAuthHeader(withT: token)

Тем не менее, это, конечно, не так элегантно, как построение по одной линии. Почему swiftc не позволяет мне писать так?

1 Ответ

0 голосов
/ 05 ноября 2018

Да, это совершенно очевидно, потому что если вы посмотрели документацию , то вы можете увидеть, что URLRequest - это struct с инициализатором URL, который также struct приводит к возврату неизменная копия оригинального запроса. mutating означает, что вы модифицируете вызывающий объект, но он не вернет "изменяемый" объект!

Это причина, по которой он выдает ошибку. Ну, все же, если вы хотите использовать тот же способ, у меня есть измененная версия вашего кода.

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...