Я предполагаю, что ваш 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
он дал мне предложение «исправить» и заполнил все те для меня.