class ViewController { lazy var client: CardClient = { let config = Shared.paypalConfig let client = CardClient(config: config) client.xyz = ... return client }() func viewDidLoad() { .. } enum OrderCreator { case orderId(String) case orderObject(OrderRequest) case failure(Error) } func submitOrder() { payPalClient.checkout(...) client.checkout( card: card, createOrder: { completion in Network.getOrderId(details) { result in switch result { case .success(let orderId): completion(.orderId(orderId)) case .failure(let error): completion(.failure(error)) } } }, onApprove: { result in switch result { case .success(let orderResponse): print("Successfully confirmed payment / validated / ?") case .failure(let error): print("Failed to confirm payment or whatever") } } ) } }

OR

class ViewController { lazy var client: CardClient = { let config = Shared.paypalConfig let client = CardClient(config: config) client.xyz = ... return client }() func viewDidLoad() { .. } func submitOrderId() { let orderId = Network.getOrderId(orderDetails) { result in { guard let result == .success(orderId) else { return } client.submit( card: card, orderId: orderId, completion: { result in switch result { case .success(let orderResponse): print("Successfully confirmed payment / validated / ?") case .failure(let error): print("Failed to confirm payment or whatever") } } ) } } func submitOrderObject() { let orderObject = OrderRequest( intent: .capture, purchaseUnits: [ ... ] ) client.submit( card: card, order: orderObject, completion: { result in switch result { case .success(let orderResponse): print("Successfully confirmed payment / validated / ?") case .failure(let error): print("Failed to confirm payment or whatever") } } ) } } client.create(order) { response in // fail or success here } client.create(orderId) client.submit(card) { response in switch response.intent { case .authorize: case .capture: } }