【问题标题】:How can I use if logic or the ternary operator to set the rawValue of an enum case in Swift?如何使用 if 逻辑或三元运算符在 Swift 中设置枚举案例的 rawValue?
【发布时间】:2020-01-07 16:46:43
【问题描述】:

我正在尝试根据设备是否为 iPhoneX 设置枚举的 rawValues,我已将其存储为布尔值 isiPhoneX。如果 isiPhoneX 为真,我希望 rawValue 为 0.0,如果不是,则为 1.0。看起来三元运算符不符合 rawValue。但是这个问题有什么变通方法/解决方案吗?

public enum Angles: Double {
   case angle1 = isiPhoneX ? 0.0 : 1.0
}

我收到以下错误消息:

“Angles”声明了原始类型“Double”,但不符合 RawRepresentable 且无法综合符合性

当前面的原始值不是整数时,枚举 case 必须声明原始值

枚举大小写的原始值必须是文字

更新: 我没有提到我还有其他不需要三元逻辑的情况,我意识到现在是相关的。更准确的例子:

public enum Angles: Double {
   case angle1 = isiPhoneX ? 0.0 : 1.0
   case angle2 = 5.0
   case angle3 = 6.0
}

【问题讨论】:

    标签: ios swift enums ternary-operator


    【解决方案1】:

    您可以改用关联值

    public enum Angles {
        case angle1(Double)
    }
    

    并像这样使用它

    let angle = Angles.angle1(isiPhoneX ? 0.0 : 1.0)
    
    switch angle {
    case .angle1(let value):
        print(value)
     }
    

    【讨论】:

      【解决方案2】:

      RawValue 必须由编译时间决定。您可以在其中将自定义逻辑放入开关盒中的计算属性,如下所示:

      public enum Angles {
         case angle1
      
          var doubleValue: Double {
              switch(self) {
                  case .angle1: return isiPhoneX ? 0.0 : 1.0
              }
          }
      }
      

      【讨论】:

      • 谢谢!如果我有其他不需要三元运算符/自定义逻辑的情况,你知道我该如何完成这项工作吗?即:case angle2 = 5.0,case angle3 = 6.0等
      • ^^ 跟进后续问题
      • 你可以从 switch case 返回那个单一的值。
      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多