The parameters of the completion handler are (data: Optional<Data>, urlResponse: Optional<Data>, error: Optional<Error>). Here is an exhaustive switch
statement of the parameter combinations:
switch (data, ulrResponse, error) {
case (.some, .some, .some):
case (.some, .some, .none):
case (.some, .none, .some):
case (.some, .none, .none):
case (.none, .some, .some):
case (.none, .none, .some):
case (.none, .some, .none):
case (.none, .none, .none):
}
Which combinations of values may be provided and which will not?
For example, I think it's fair to say that both (.some, .none, .some)
and (.some, .none, .none)
are invalid because a response would have to be provided in order to receive data to pass to the closure, and the documentation states:
If a response from the server is received, regardless of whether the request completes successfully or fails, the response parameter contains that information.