Шаблон не может соответствовать значениям типа 'SKError' - PullRequest
0 голосов
/ 21 мая 2019

Я получаю сообщение об ошибке

Шаблон не может соответствовать значениям типа 'SKError'

Однако, когда я посмотрел код для SKError с набором магазинаЯ правильно ввел ошибки и не смог найти решение.(Получение 4 ошибок - шаблон не может соответствовать значениям типа 'SKError' - для каждого случая ошибки коммутатора).

func alertForPurchaseResult(result : PurchaseResult) -> UIAlertController {
    switch result {
    case .success(let product):
        print("Purchase Succesful: \(product.productId)")

        return alertWithTitle(title: "Thank You", message: "Purchase completed")
        break
    case .error(let error):
        print("Purchase Failed: \(error)")
        switch error {
        case .failed(let error):
            if (error as NSError).domain == SKErrorDomain {
                return alertWithTitle(title: "Purchase Failed", message: "Check your internet connection or try again later.")
            }
            else {
                return alertWithTitle(title: "Purchase Failed", message: "Unknown Error. Please Contact Support")
            }
            break
        case .invalidProductId(let productID):
            return alertWithTitle(title: "Purchase Failed", message: "\(productID) is not a valid product identifier")
            break
        case .noProductIdentifier:
            return alertWithTitle(title: "Purchase Failed", message: "Product not found")
        break
        case .paymentNotAllowed:
            return alertWithTitle(title: "Purchase Failed", message: "You are not allowed to make payments")
            break

        }
        break
    }
}




func purchase(purchase: RegisteredPurchase){
       NetworkActivityIndicatorManager.NetworkOperationStarted()
       SwiftyStoreKit.purchaseProduct(bundleID + "." + purchase.rawValue, completion: {
        result in
        NetworkActivityIndicatorManager.NetworkOperationFinished()

        if case .success(let product) = result {
            if product.needsFinishTransaction{
                SwiftyStoreKit.finishTransaction(product.transaction)
            }
            self.showAlert(alert: self.alertForPurchaseResult(result: result))
        }
    })
}

1 Ответ

1 голос
/ 22 мая 2019

Я предполагаю, что ваш PurchaseResult является чем-то вроде:

typealias PurchaseResult = CustomResult<Product, SKError>

(я не знаю, какой у вас тип Result, но все, что я знаю, это то, что стандарт Resultтип .failure или .success, а у вас .error вместо .failure.)

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

enum MyAppError: Error {
    case invalidProductId(String)
    case noProductIdentifier
    case paymentNotAllowed
}

Итак, я сначала изменил бы PurchaseResult, чтобы разрешить любые соответствующие типы ошибок:

typealias PurchaseResult = CustomResult<Product, Error>

И затем обработал бы различные типы ошибок

func alertForPurchaseResult(result: PurchaseResult) -> UIAlertController {
    switch result {
    case .success(let product):
        return alertWithTitle(title: "Thank You", message: "Purchase completed")

    case .error(let error as SKError):
        switch error.code {
        case .unknown:
            <#code#>
        case .clientInvalid:
            <#code#>
        case .paymentCancelled:
            <#code#>
        case .paymentInvalid:
            <#code#>
        case .paymentNotAllowed:
            <#code#>
        case .storeProductNotAvailable:
            <#code#>
        case .cloudServicePermissionDenied:
            <#code#>
        case .cloudServiceNetworkConnectionFailed:
            <#code#>
        case .cloudServiceRevoked:
            <#code#>
        case .privacyAcknowledgementRequired:
            <#code#>
        case .unauthorizedRequestData:
            <#code#>
        case .invalidOfferIdentifier:
            <#code#>
        case .invalidSignature:
            <#code#>
        case .missingOfferParams:
            <#code#>
        case .invalidOfferPrice:
            <#code#>
        @unknown default:
            <#code#>
        }

    case .error(let error as MyAppError):
        switch error {
        case .invalidProductId(let productID):
            return alertWithTitle(title: "Purchase Failed", message: "\(productID) is not a valid product identifier")

        case .noProductIdentifier:
            return alertWithTitle(title: "Purchase Failed", message: "Product not found")

        case .paymentNotAllowed:
            return alertWithTitle(title: "Purchase Failed", message: "You are not allowed to make payments")
        }

    case .error:
        return alertWithTitle(title: "Purchase Failed", message: "Unknown Error. Please Contact Support.")
    }
}

@unknown введите ключевое слово, если вы используете Swift 5. Вы можете опустить это, если используете более ранние версии Swift.

Кстати, если вам интересно, что перечисления SKError, когда я сделал switchдля .code из SKError он дал мне предложение «исправить» и заполнил все те для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...