SwiftUI 中的 Toggle() 运算符可以实现整数吗

Posted

技术标签:

【中文标题】SwiftUI 中的 Toggle() 运算符可以实现整数吗【英文标题】:Can Integers be Implemented in the Toggle() Operator in SwiftUI 【发布时间】:2020-06-24 00:56:29 【问题描述】:

我正在尝试为 SwiftUI 中的 toggle() 运算符找出一种解决方法,它不使用布尔类型变量。

我遇到的问题是 mysql 数据库没有 Bool 数据类型......因此不能在字段中设置“真”和/或“假”(不是字符串,而是 Swift 的文字类型接受为布尔输入)。

我尝试使用整数,0 表示假,1 表示真,并且还尝试过类型转换,但不知道如何做到这一点。

我正在使用 API 访问我的数据库,该 API 以 JSON 格式生成我的数据并加载到许多对象中,每个对象都需要使用 toggle() 运算符。

有人知道在没有布尔数据类型的情况下使用 toggle() 运算符的替代方法吗?

另外——我发现 MySQL 没有文字 Bool 数据类型非常奇怪(并且令人沮丧)。我知道 0 和 1 更有效......但是一旦我从数据库中获取它,是否可以立即将 JSON 的值从整数更改为布尔值?

谢谢!

【问题讨论】:

你做错了。除了处理与数据库接口的边界层之外,特定数据库(今天的 MySQL,明天可能是另一个)的详细信息根本不应该从任何 Swift 代码中明显看出。你应该使用Bool 亚历山大,感谢您的回复!您对在 Swift 环境中对我的数据结构进行建模以允许将整数(或字符串)值用作布尔值有什么建议吗? 我不知道你是如何与数据库交互的,但无论你做什么,你都应该从数据库特定类型转换到/从 Swift“通用货币”类型转换,例如 @987654322 @、Int(在大多数情况下是首选,即使不需要负值或大值)、StringURLUIImage 等。您应该为所有输入/输出机制执行此操作,如数据库、文件访问、网络 API。设计易于使用的数据模型。仅在周边必要时转换为/转换为其他格式 例如,永远不要使用字符串作为文件路径。也许MySQL 没有URL 的概念。将模型写入数据库时​​,将其 URL 转换为字符串,并保存字符串。当您稍后阅读该模型时,立即将字符串加载到 URL 中,并且只在您的应用程序中对其进行操作。 Bool 或任何其他无法表示的类型也是如此。 【参考方案1】:

我将支持上面关于不将任何数据库的详细信息暴露给其余代码的评论。最好使用带有Bool 的模型,而不是将Int 改编成Bool

所以,为了用一个例子重申你的问题,你需要像这样转换一个 JSON 对象:

 "boolProp": 1, "otherProp": "something" 

进入这样的模型:

struct Model 
   var boolProp: Bool
   var otherProp: String

很遗憾,Codable 没有提供自定义解码原始类型的方法。

您始终可以实现手动解码,但它需要您解码所有属性,而不仅仅是特定的 Bool 属性。因此,如果您有很多其他属性,那显然不是最佳方法。

或者,您可以将布尔值的整数表示解码为私有变量,并为您的代码可以使用的Bool 提供计算属性:

enum IntRepresentableBool: Int, Codable 
    case `true` = 1
    case `false` = 0


struct Model: Codable 

  private var _boolProp: IntRepresentableBool
  var boolProp: Bool 
     get  _boolProp == .true ? true : false 
     set  _boolProp = newValue ? .true : .false 
  
  
  var otherProp: String

  enum CodingKeys: String, CodingKey 
     case _boolProp = "boolProp"
     case otherProp
  

通过这种方法,您可以解码对象并按预期使用它:

let decoder = JSONDecoder()
var model = try decoder.decode(Model.self, from: jsonData)

model.boolProp.toggle()

【讨论】:

以上是关于SwiftUI 中的 Toggle() 运算符可以实现整数吗的主要内容,如果未能解决你的问题,请参考以下文章

切换 swiftUI toggle() 时如何触发操作?

SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用

如何在 SwiftUI Toggle 中使用自定义图像

SwiftUI 中的动画状态变化

UserDefaults 在 SwiftUI 中与 Toggle 绑定

有没有办法使用 SwiftUI 将选项绑定到 Toggle / Slider