1
votes

Swift 4 - Convertir 1 ou 0 de mysql en bool

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 :



1
votes

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.


4 commentaires

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.



0
votes

@ 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")
}


2 commentaires

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.