You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中使用toggle()切换枚举关联布尔值时出现类型错误的解决方法咨询

Swift中使用toggle()切换枚举关联布尔值时出现类型错误的解决方法咨询

嗨,我来帮你搞定这个问题~

你遇到的问题核心其实是对toggle()方法的使用理解有点偏差:toggle()是一个原地修改布尔值的方法,它没有返回值(返回类型是Void,也就是你看到的()),所以你不能把它的调用结果赋值给新的isSelected常量,这就是警告和错误的来源。

我们来一步步修正你的代码:

  1. 你在switch的case里已经把关联的isSelected绑定成了var(可变变量),这一步是对的,不需要额外声明新的常量。
  2. 直接调用isSelected.toggle(),这个方法会直接把变量的布尔值反转,不需要接收它的返回结果。
  3. 最后用修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:03:01