Я не совсем уверен, чего вы хотите достичь, когда звоните .map
на Result
.
. В типе перечисления swift Result
определены два крайних случая:
- Либо он имеет тип
.success<Success>
- , либо он имеет тип
.failure<Failure>
Рассматривая расширение init
Result
:
public extension Result {
init(_ success: Success?, _ failure: Failure?) {
if let success = success {
self = .success(success)
} else if let failure = failure {
self = .failure(failure)
} else {
fatalError("Illegal combination found.\n Success: \(success as Any), Failure: \(failure as Any)")
}
}
}
Я вижу, что если первый параметр (snapshot
в вашем случае) не является nil
, вы создаете .success
Result, иначе вы создаете .failure
Result с предоставленнымerror
.Если оба значения nil
, вы аварийно завершаете работу с fatalError
. Когда вы вызываете .map
на Result
, это будет выполнено внутри, только если Result
равно .success
, например,snapshot
не является nil
.Тем не менее, при закрытии карты вы проверяете, если snapshot.exists
, а если нет, вы возвращаете nil
.Но это будет недопустимо, потому что это приведет к новому Result.success
с nil
связанным значением.
Вы должны проверить логику того, как вы хотите, чтобы результат .success
был сопоставлен с новымтип результата.
Полагаю, что вы действительно хотите, это следующее: Если есть snapshot
, и snapshot.exits
, то вы хотите вызвать завершениеобработчик с Result.success
, еще с Result.failure
.Что-то похоже на это:
T.subCollectionRef(of: parentDocument.ref).document(documentID).getDocument { snapshot, error in
if let snapshot = snapshot, snapshot.exists {
completion(Result.success(snapshot))
} else {
Result.failure(error)
}
}