Swift中使用toggle()切换枚举关联布尔值时出现类型错误的解决方法咨询
Swift中使用toggle()切换枚举关联布尔值时出现类型错误的解决方法咨询
嗨,我来帮你搞定这个问题~
你遇到的问题核心其实是对toggle()方法的使用理解有点偏差:toggle()是一个原地修改布尔值的方法,它没有返回值(返回类型是Void,也就是你看到的()),所以你不能把它的调用结果赋值给新的isSelected常量,这就是警告和错误的来源。
我们来一步步修正你的代码:
- 你在switch的case里已经把关联的
isSelected绑定成了var(可变变量),这一步是对的,不需要额外声明新的常量。 - 直接调用
isSelected.toggle(),这个方法会直接把变量的布尔值反转,不需要接收它的返回结果。 - 最后用修改后的
isSelected重新构造枚举实例即可。
修正后的代码如下:
switch identifierToChange { case .main(let emotion, let iconName, let red, let green, let blue, var isSelected, let uuid): // 直接原地修改isSelected的值,不需要赋值 isSelected.toggle() // 用修改后的变量重新构造枚举 identifierToChange = .main( emotion: emotion, icon: iconName, red: red, green: green, blue: blue, isSelected: isSelected, uuid: uuid ) default: // 别忘了处理其他case(如果有的话) break }
另外给你一个小建议:你的枚举关联值太多了,维护起来容易出错,不如把这些属性封装成一个遵循Equatable和Hashable的结构体,这样枚举的定义会简洁很多,后续修改也更方便:
struct ItemDetails: Equatable, Hashable { let emotion: String let icon: String let red: CGFloat let green: CGFloat let blue: CGFloat var isSelected: Bool let uuid: UUID } enum Item: Equatable, Hashable { case main(ItemDetails) }
这样后续切换选中状态的代码会更简洁:
switch identifierToChange { case .main(var details): details.isSelected.toggle() identifierToChange = .main(details) default: break }
内容来源于stack exchange
相关产品推荐
相关产品推荐

