2 votes

Impossible de convertir la valeur du type 'Swift.UInt32' en 'Swift.Int'

Dans le projet Tests, j'ai des extensions avec certaines fonctions d'aide aux tests. Comme ceci :

extension Employee {
    static func mockDict() -> Dictionary! {
        return ["ID": arc4random() % 1000,
                "FirstName": "Prénom de l'employé",
                ...]
    }
}

(J'ai supprimé le code inutile). J'ai un problème d'accès à l'ID de ce dictionnaire pour une raison encore inconnue. J'ai un SIGABRT 6 lors du cast

employeeDict["ID"] as! Int

La console du débogueur Xcode n'aime pas non plus cet entier particulier :

Ints

Les chaînes fonctionnent bien. Avez-vous rencontré un tel problème ? Des idées ?

MODIFIER : Au cas où quelqu'un rencontrerait également ce problème. LE CASTING DE UInt32/Int32 VERS Int ÉCHEC EST INTENTIONNEL. Même si l'objet a été casté en Any ou Anyobject entre-temps. Même si

@available(*, message: "La conversion de UInt32 en Int réussira toujours.")
public init?(exactement valeur: UInt32)

dans la déclaration de Int

public struct Int : EntierSigné, Comparable, Equatable {
    ...
}

et

public struct Int32 : EntierSigné, Comparable, Equatable {
    ...
}

MODIFIER 2 pour ceux qui pourraient rencontrer ce comportement dans la sérialisation JSON. Oui, la sérialisation échoue avec l'erreur NSInvalidArgumentException Type invalide dans l'écriture JSON (_SwiftValue) si on lui demande de sérialiser UInt32, Int64 ou toute autre instance de protocole Integer autre que Int

5voto

Pranav Wadhwa Points 5726

Essayez ceci:

let a = employeeDict["ID"] as! UInt32
let number = Int(a)

Maintenant, vous pouvez utiliser number pour effectuer n'importe quelle action.

1voto

vadian Points 29149

Les types numériques "primitifs" Swift ne sont pas interchangeables et ne peuvent pas être convertis les uns en les autres.

Vous devez utiliser un initialiseur.

Puisque arc4random() renvoie UInt32 et que vous voulez utiliser la valeur comme Int, convertissez-la immédiatement dans la déclaration du dictionnaire:

["ID": Int(arc4random() % 1000), ...

PS: Ne déclarez pas un retour clairement non optionnel comme optionnel déballé implicitement, cela contredit le système de type fort de Swift.

static func mockDict() -> Dictionary

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X