Hello à tous.

Voilà je débute dans le langage swift, je me débrouille avec plein d'autre langages mais là je ne comprends pas comment passe les variables et les paramètres dans les fonctions...

Je souhaite rajouter une fonction de contrôle du 3D secure de chez Stripe, voici l'exemple donné par Stripe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Assemble the PaymentIntent parameters
let paymentIntentParams = STPPaymentIntentParams(clientSecret: clientSecret)
paymentIntentParams.paymentMethodId = paymentResult.paymentMethod.stripeId
 
// Confirm the PaymentIntent
STPPaymentHandler.shared().confirmPayment(withParams: paymentIntentParams, authenticationContext: paymentContext) { status, paymentIntent, error in
    switch status {
    case .succeeded:
        // Your backend asynchronously fulfills the customer's order, e.g. via webhook
        completion(.success, nil)
    case .failed:
        completion(.error, error) // Report error
    case .canceled:
        completion(.userCancellation, nil) // Customer cancelled
    @unknown default:
        completion(.error, nil)
    }
}
Il s'agit d'une application existante, voici la partie concerné par rapport au paiement :
PurchaseValidationController.swift :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import UIKit
import Lottie
import Firebase
 
class PurchaseValidationController: UIViewController {
 
    let worker = PurchaseValidationWorker()
 
    @IBOutlet private weak var animationView: AnimationView!
    @IBOutlet private weak var titleLabel: UILabel!
    @IBOutlet private weak var subtitleLabel: UILabel!
    @IBOutlet private weak var purchaseButton: PrimaryButton!
 
    override func viewDidLoad() {
        // ...
    }
 
    private func buyProduct() {
        if worker.product.creator?.id == worker.user.id {
            displayUserOwnProductError()
            return
        }
 
        purchaseButton.displayActivity(true)
 
        worker.buyProduct {
            [weak self] (error) in
            if self == nil { return }
 
            print("Purchase validation controller")
 
 
            self?.purchaseButton.displayActivity(false)
 
            if error != nil {
                self?.displayPurchaseError()
            } else {
                if let id = self?.worker.product.id,
                    let title = self?.worker.product.title,
                    let order = self?.worker.order {
                    print(order)
                    Analytics.logEvent(AnalyticsEventBeginCheckout, parameters: [
                        AnalyticsParameterItemID: id,
                        AnalyticsParameterItemName: title,
                        ])
                }
                self?.replaceByPurchaseConfirmationController()
            }
        }
    }
 
}
On appel donc la fonction buyProduct du worker qui est dans "PuschaseValidationWorker.swift"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Foundation
import Stripe
 
class PurchaseValidationWorker {
 
    // Input
    var product: Product!
    var user: Account!
 
    // Ouput
    var order: Order?
 
    func buyProduct(completion: @escaping (_ error: AppError?) -> Void) {
 
        Product.buyProduct(id: product.id!){
            [weak self] (order, error) in
            self?.order = order
            print("Purchase Validation Worker")
            completion(error)
        }
    }
 
}
Qui appel lui la fonction buyProduct de Product soit du fichier "Product Networking.swift"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import Alamofire
import CoreLocation
import Stripe
 
extension Product {
 
    static func buyProduct(id: String,
                           completion: @escaping (_ order: Order?, _ error: AppError?) -> Void) {
        ProductAPIRouter.buyProduct(productId: id).performRequest { (result, networkError) in
            processOrderResponse(result: result,
                                 networkError: networkError,
                                 completion: completion)
 
            // On envoi la demande à une API nodeJS qui retourne le "result"
            // J'ai essayé de mettre la fonction ici mais il me met une erreur à cause du "paymentContext"
        }
    }
 
}
J'ai essayé de mettre la fonction Stripe dans chacun des 3 fichiers mais rien à faire. Je comprends pas où je dois la placer.
En tout logique vu que je récupère la réponse de l'API dans la fonction "buyProduct" du fichier "Product Networking.swift" je dois la mettre à cette endroit ?
Je l'ai donc mise dans cette fonction mais il ne trouve pas le "paymentContext" de la fonction stripe (authenticationContext: paymentContext)

Certain utilise "self" comme paymentContext, je dois donc déclaré le paymentContext quelque part mais où ?

Merci d'avance, car je galère depuis des jours dessus!