Дополнительный аргумент в вызове при закрытии вызова - PullRequest
0 голосов
/ 23 сентября 2019

Попытка реализовать Firebase / Firestore в iOS, добавление следующего дает мне Extra argument in call ошибку на (snapshop , error).

T.subCollectionRef(of: parentDocument.ref).document(documentID).getDocument { snapshot, error in
    completion(Result(snapshot, error)
        .map { snapshot in snapshot.exists ? .init(snapshot: snapshot) : nil }
    )
}

https://github.com/sgr-ksmt/SwiftUI-Firebase-Todo/blob/master/FireTodo-w-SwiftUI/Sources/Models/FirestoreModel.swift#L44

PS: я супер-нуб чтобы быстро.

1 Ответ

0 голосов
/ 23 сентября 2019

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