Nommer les variables lors d'un @escaping

Bonsoir à tous,

J’ai créé une petite fonction pour vérifier si l’utilisateur a le droit d’uploader un fichier en fonction de son niveau d’abonnement.

J’ai créé un @escaping pour éviter de devoir copier la fonction partout où j’en ai besoin mais juste y faire appel et réaliser la tâche en fonction de la réponse qu’elle renvoie.

Voici la fonction

   func checkImageSizeAndDBLimit(image:UIImage?, Completion: @escaping (_ error:String?, _ message:String) -> Void ) {
    var fileManipulator = FileManipulator()
    guard let inputImage = image else { return }
    let size = fileManipulator.uiImageSize(image: inputImage)
    let name = AppSubscription().userStatus
    switch name {
    case Subscriptions().Pro.name:
        let dbSIze = Files().filesStorageUsage
        let limit = Subscriptions().Pro.fileSizeDB
        let difference = limit - dbSIze
        if difference > size {
            print("Enought Space")
            Completion(nil, "Enought Space")
        }else{
            Completion("Not enought Space", "You reach your limit \(limit) Mb")
        }
    case Subscriptions().Free.name:
        let dbSIze = Files().filesStorageUsage
        let limit = Subscriptions().Free.fileSizeDB
        print("\(limit) - \(dbSIze)")
        let difference = limit - dbSIze
        if difference > size {
            print("Enought Space")
            Completion(nil, "Enought Space")
        }else{
            Completion("Not enought Space", "You reach your limit \(limit) Mb")
        }
    default:
        let dbSIze = Files().filesStorageUsage
        let limit = Subscriptions().Free.fileSizeDB
        let difference = limit - dbSIze
        if difference > size {
            print("Enought Space")
            Completion(nil, "Enought Space")
        }else{
            Completion("Not enought Space", "You reach your limit \(limit) Mb")
        }
    }
}

Mais quand j’y fait appel, je n’arrive pas à nommer les deux possibilités. je reçois juste String? et String comme si dessous

Si quelqu’un a une idée, je suis preneur.

Merci

Chris

Bonjour,

Si je comprends bien, il faut que tu remplaces (String?, String) par (error, message) ce qui te donnera deux variables à utiliser dans le code de la closure, error, de type String? et message de type String.

Nota: le nom des variables est libre, j’ai mis (error, message) pour être cohérent de la définition de ta question, mais tu pourrais mettre (x,y) ou (unStringErreurQuiPourraitEtreNil, unStringMessage)

Cordialement
Nicolas

Ma question c’est, comment arriver à nommer mes variables dans ma fonction initiale pour ne pas avoir String qui s’affiche mais savoir que derrière le premier, je vais retourner une error et derrière le second je vais retourner un message d’erreur.

Alors pour les erreurs, j’ai ajouté la gestion des Error. Du coup, c’est bien mieux que de jouer avec des String optionnels

Voici alors ce que ça donne

    func checkUIImageSizeAndDBLimit(image:UIImage?, Completion: @escaping (_ error:Error?, _ message:String) -> Void ) {
    
    let subscriptionLimits = SubscriptionsLimits()
    let fileManipulator = FileManipulator()
    
    guard let inputImage = image else { return }
    
    let size = fileManipulator.uiImageSize(image: inputImage)
    let name = AppSubscription().userStatus
    
    switch name {
    case subscriptionLimits.Pro.name:
        let dbSIze = Files().filesStorageUsage
        let limit = subscriptionLimits.Pro.fileSizeDB
        let difference = limit - dbSIze
        print("Limit:\(limit) - DBSize\(dbSIze) - Difference\(difference)")
        if difference > size {
            print("Enought Space")
            Completion(nil, "Enought Space")
        }else{
            let error = MyError.self
            Completion(error.spaceError, "You reach your limit \(limit) Mb")
        }
    case subscriptionLimits.Free.name:
        let dbSIze = Files().filesStorageUsage
        let limit = subscriptionLimits.Free.fileSizeDB
        let difference = limit - dbSIze
        print("Limit:\(limit) - DBSize\(dbSIze) - Difference\(difference)")
        if difference > size {
            print("Enought Space")
            Completion(nil, "Enought Space")
        }else{
            let error = MyError.self
            Completion(error.spaceError, "You reach your limit \(limit) Mb")
        }
    default:
        let dbSIze = Files().filesStorageUsage
        let limit = subscriptionLimits.Free.fileSizeDB
        let difference = limit - dbSIze
        print("Limit:\(limit) - DBSize\(dbSIze) - Difference\(difference)")
        if difference > size {
            print("Enought Space")
            Completion(nil, "Enought Space")
        }else{
            let error = MyError.self
            Completion(error.spaceError, "You reach your limit \(limit) Mb")
        }
    }
}




public enum MyError: Error {
case spaceError
}



extension MyError : LocalizedError {
    public var errorDescription: String? {
        switch self {
        case .spaceError:
            return NSLocalizedString("not enough space.", comment: "The user reach the limit of there account")
        }
    }
}

Ce qui donne ceci. C’est déjà bcp mieux. Maintenant reste à remplacer le « mot » String par le « mot »
message qui renvoie un String

A mon avis, en créant simplement une structure qui s’appellerait « Message » et contiendrait un String ça devrait marcher

Effectivement. Une petite Struct et c’est résolu. Du coup on obtient ça quant on appelle la fonction.

Et on peut alors récupérer le titre et le corps du message pour l’afficher dans l’alerte par exemple.