【问题标题】:Swift 4 - Convert 1 or 0 from mysql to boolSwift 4 - 将 1 或 0 从 mysql 转换为 bool
【发布时间】:2019-05-11 14:44:14
【问题描述】:

我这里有这个变量,它是 Any

 item["completed"]

mysql数据库中的1或0是真还是假,如何将1或0转换为真或假?

我试过这个:

 (item["completed"] as! NSNumber).boolValue)

但我收到此错误

无法将“NSTaggedPointerString”(0x10f906560) 类型的值转换为 'NSNumber' (0x10e455d40)。

【问题讨论】:

  • 错误信息表明item["completed"]是一个字符串而不是一个数字。
  • print(item["completed"]),这样我们才能看到真正的价值。
  • print(item["completed"]) 打印出 1
  • @user979331 将其转换为字符串。 let completed = item["completed"] as? String == "1"

标签: ios swift


【解决方案1】:

你可以试试下面我已经实现的扩展,

extension String {

    var bool: Bool {
        return self == "1" ? true : false
    }
}

 (item["completed"] as? String).bool

希望这种方式可以帮助到你。

【讨论】:

  • 这应该可以解决问题。但是如果我们谈论计算机科学,假设1true 而所有其他人为false 是错误的。空字符串和/或 null/nil 字符串应为 false,任何其他字符串应为 true。
  • @ArdaOğulÜçpınar “0”呢?
  • @Nate 当然是零。你可以在我的回答中看到。
【解决方案2】:

随便用

let isCompleted = "1" == (item["completed"] as? String)

如果您使用Decodable 进行json 解析,您可以使用ApiBool 结构体而不是Bool

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

注意 如cmets中提到的,你得到一个String数据类型,它应该是一个整数,这是由libmysql驱动引起的,你可以使用@987654330连接到MySQL @driver 相反,这将导致 JSON 具有正确的数字数据类型,以下帖子可能会帮助您配置驱动程序

https://stackoverflow.com/a/46690317/1244597

https://stackoverflow.com/a/45366230/1244597

【讨论】:

    【解决方案3】:

    @ahemadabbas-vagh 分享了一个很好且可重用的方法。但是如果我们谈论计算机科学,字符串的布尔相等性不应该这样测量。

    这个方法和他的一样,但是它询问Bool的值是真还是假,而不是StringBool 应该知道一个值是真还是假,而不是String

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

    但它仍然不正确。在计算机科学中,null/nil 或/和一个空字符串应该为假,而任何其他字符串都应该为真。您可以将字符串 "0" 添加到此集合中。

    你可以这样实现;可能仍然存在更好的方法。 这个想法是;全局字符串只能在不是“0”、不是“”(空字符串)、不是 null/nil 或为“true”时转换为 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")
    }
    

    如果你使用Decodable协议;我知道你知道如何处理,但是:

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

    【讨论】:

    • 基本上你的建议是正确的,但 mysql 可靠地返回 "0""1" 作为 Bool 值,仅此而已。
    • 是的,这些已经并且也涵盖了。检查操场。您实现的任何代码都需要可重用并尽可能适合计算机科学。我想给你一些适合这个想法的东西。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2019-08-29
    • 2021-08-05
    • 2019-02-09
    • 2022-12-28
    • 2019-10-11
    相关资源
    最近更新 更多