O checkout devolve um CheckoutResult.
enum CheckoutResult {
    case approved(PaymentResult)  // pagamento confirmado
    case pending(PaymentResult)   // referência gerada
    case cancelled                // utilizador cancelou
    case failed(FaciPayError)     // erro
}
completion: { result in
    switch result {
    case .approved(let payment):
        updateUI(status: "Confirmado", orderId: payment.orderId)
    case .pending(let payment):
        showReference(payment.rawData)
    case .cancelled:
        updateUI(status: "Cancelado")
    case .failed(let error):
        showError(error.localizedDescription)
    }
}

PaymentResult

orderId
String
Identificador da ordem FaciPay.
status
PaymentStatus
.created | .pending | .cancelled | .confirmed.
type
PaymentType
.direct | .mcx | .reference.
rawData
[String: String]?
Campos adicionais da resposta (referência, entidade, etc.).

FaciPayError

.invalidKey(String)          .paymentFailed(String)
.keyValidationFailed(String) .cancelled
.networkError(String)        .invalidRequest(String)
.sdkNotInitialized           .uiError(String)
.timeout                     .unknown(String)
Todos os erros expõem errorDescription e recoverySuggestion (via LocalizedError).
Como na web, o webhook no teu backend é a fonte da verdade. Confirma o pagamento pelo webhook antes do fulfillment. Ver Webhooks.