J'ai cette variable ici, c'est un Any
(item["completed"] as! NSNumber).boolValue)
C'est soit 1 ou 0 qui est vrai ou faux à partir de la base de données mysql, comment puis-je convertir le 1 ou 0 en vrai ou faux?
J'ai essayé ceci:
item["completed"]
mais j'obtiens cette erreur
Impossible de convertir la valeur de type 'NSTaggedPointerString' (0x10f906560) en 'NSNumber' (0x10e455d40).
3 Réponses :
Utilisez simplement
struct ApiBool: Codable {
let value: Bool
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let string = try? container.decode(String.self) {
self.value = string == "1"
} else {
let intVal = try container.decode(Int.self)
self.value = intVal == 1
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
try container.encode(self.value ? 1 : 0)
}
}
Si vous utilisez Decodable pour l'analyse json, vous pouvez utiliser la structure ApiBool suivante au lieu de Bool
let isCompleted = "1" == (item["completed"] as? String)
Remarque Comme mentionné dans les commentaires, vous avez un type de données String et il est attendu être un entier, cela est causé par le pilote libmysql , vous pouvez vous connecter à MySQL en utilisant le pilote mysqlnd à la place, cela se traduira par un JSON avec les types de données numériques appropriés, après les articles peut vous aider à configurer le pilote
https://stackoverflow.com/a/46690317/1244597
https://stackoverflow.com/a/45366230/1244597
p>
Vous pouvez essayer ci-dessous l'extension que j'ai implémentée,
extension String {
var bool: Bool {
return self == "1" ? true : false
}
}
(item["completed"] as? String).bool
J'espère que cette méthode pourra vous aider.
Cela devrait résoudre le problème. Mais supposer 1 comme vrai et tous les autres comme faux est une erreur si nous parlons d'informatique. Une chaîne vide et / ou une chaîne null / nil doit être fausse et toute autre chaîne doit être vraie.
@ ArdaOğulÜçpınar qu'en est-il de «0»?
@Nate et zéro bien sûr. Vous pouvez voir dans ma réponse.
@Nate J'ai utilisé une condition ternaire si vous avez une valeur autre que "1", alors vous obtenez toujours faux, essayez d'abord cette solution.
@ ahemadabbas-vagh a partagé une bonne approche réutilisable. Mais si nous parlons d'informatique, l'égalité booléenne d'une chaîne ne doit pas être mesurée comme ça.
Cette approche est la même que la sienne, mais elle demande à Bool si la valeur est vraie ou fausse, pas à String . Bool doit savoir si une valeur est vraie ou fausse, et non String .
struct aStruct: Decodable {
let boolVal: Bool
enum CodingKeys: String, CodingKey {
case completed
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let boolString = try container.decode(String.self, forKey: .completed)
self.boolVal = Bool.from(stringValue: boolString)
}
}
Mais ce n'est toujours pas correct. En informatique, null / nil ou / et une chaîne vide doivent être faux et toutes les autres chaînes doivent être vraies. Vous pouvez ajouter la chaîne "0" à cet ensemble.
Vous pouvez implémenter comme ceci; de meilleures approches pourraient encore exister.
L'idée est; globalement, une chaîne ne peut être convertie en true que si ce n'est pas "0", pas "" (chaîne vide), pas null / nil ou si c'est "true".
var str = "1" // check for nil, empty string and zero; these should be false; any other string should be true.
extension Bool {
static func from(stringValue str: String) -> Bool {
if str == "true" {
return true
}
guard let intVal = Int(str) else {
return false
}
return Bool(truncating: intVal as NSNumber)
}
}
if Bool.from(stringValue: str) {
print("TRUE")
} else {
print("FALSE")
}
Si vous utilisez le protocole Decodable ; Je sais que vous savez comment gérer mais:
var str = "1"
extension Bool {
static func from(stringValue str: String) -> Bool {
return str == "1"
}
}
if Bool.from(stringValue: str) {
print("TRUE")
} else {
print("FALSE")
}
Fondamentalement, votre suggestion est correcte mais mysql renvoie de manière fiable "0" ou "1" comme valeur booléenne, rien d'autre.
Oui, cela couvre déjà et aussi cela. Vérifiez sur une aire de jeux. Tout code que vous avez implémenté doit être réutilisable et adapté autant que possible à l'informatique. J'essaye de te donner quelque chose qui convient à cette idée.
stackoverflow.com/questions/40060097/converting-int-to-bool < / a> vérifiez les commentaires @lingchen.
Le message d'erreur indique que
item ["completed"]est une chaîne et non un nombre.Veuillez
imprimer (item ["completed"])afin que nous puissions voir quelle est la valeur réelle.imprimer (élément ["terminé"]) imprime 1
@ user979331 le convertit en chaîne.
let completed = item ["completed"] comme? Chaîne == "1"