枚举字符串值 - 二进制运算符不能应用于Bool和String类型的操作数

时间:2015-12-18 19:25:12

标签: ios swift enums

enum DeviceiPad: String {
    case iPadAir = "iPadAir"
    case iPadAir2 = "iPadAir2"
}

func adjustFontsForDevices() {
    let modelName = UIDevice.currentDevice().modelName

    //iPad size adjustments
    guard modelName == DeviceiPad.iPadAir.rawValue ||
        DeviceiPad.iPadAir2.rawValue 
        else {return}
    do {
        adjustCountTitles()
        }

modelName调用String。我想检查该字符串是否与两个枚举原始值(也是字符串)中的任何一个匹配。

出于某种原因,Xcode抛出此错误: Binary operator || cannot be applied to operands Bool and String

  • 如果您不熟悉,请不要让guard抛弃您。错误与if
  • 相同
  • 如果只有一个字符串值,则guard有效。添加第二个会引发错误。

一直试图弄清楚为什么它会将String值视为Bool。也搜索了一下,但没有在其他地方看到这个问题。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

一点修复

首先这个

let modelName = UIDevice.currentDevice().modelName

变成这个

let modelName = UIDevice.currentDevice().model

答案

接下来

guard modelName == DeviceiPad.iPadAir.rawValue || DeviceiPad.iPadAir2.rawValue else { return }

变成这个

guard modelName == DeviceiPad.iPadAir.rawValue || modelName == DeviceiPad.iPadAir2.rawValue else { return }

更新:测试您的modelName是否为DeviceiPad

的值

查看下面的评论,您可以询问如何快速检查modelName是否为DeviceiPad的值。

当然,你想要避免这个

guard
    modelName == DeviceiPad.iPadAir.rawValue ||
    modelName == DeviceiPad.iPadAir2.rawValue ||
    modelName == DeviceiPad.iPadMini.rawValue ||
    modelName == DeviceiPad.iPadMini2.rawValue ||
    modelName == DeviceiPad.iPadMini3.rawValue ||
    modelName == DeviceiPad.iPadMini4.rawValue else { return }

你可以简单地写

guard let model = DeviceiPad(rawValue: modelName) else { return }

在这种情况下,如果modelName确实表示DeviceiPad个案的rawValue,则枚举值为create,并执行下一行。否则执行else块。

答案 1 :(得分:1)

我不是一个快速的程序员,但我明白这一点:

guard modelName == DeviceiPad.iPadAir.rawValue ||
    DeviceiPad.iPadAir2.rawValue 

不应该

guard modelName == DeviceiPad.iPadAir.rawValue ||
    modelName == DeviceiPad.iPadAir2.rawValue 

您不能简单地执行x == y || z因为z作为一个语句本身不是一个布尔值。也就是说,语句如下所示:(x == y) || zz完全是寂寞的,并没有与任何东西相比。有些语言允许使用它,但大多数语言都没有。

答案 2 :(得分:0)

如果您只想清理if语句,并且对这些设备类型进行逻辑分组,则可以在DeviceiPad枚举上添加静态方法。

enum DeviceiPad:String {
    case iPadAir  = "iPadAir"
    case iPadAir2 = "iPadAir2"
    case iPad1 = "iPad"

    static func isSpecialDevice(modelName:String) -> Bool
    {
        guard let model = DeviceiPad(rawValue: modelName) else
        {
            return false
        }

        switch model
        {
        case iPadAir, iPadAir2:
            return true
        default:
            return false
        }
    }
}

然后你才会使用:

guard DeviceiPad.isSpecialDevice(modelName) else
{
   return
}

答案 3 :(得分:0)

我简化了上面的代码,专注于比较。但是有了更大的枚举,我在Leo Dabus'以上建议尝试切换。它的工作原理相当简洁,所以我认为我可以在这里添加它作为一个选项,因为它可以很好地处理更大的枚举列表并允许不同的情况......

    switch modelName {
    case DeviceiPad.iPadAir.rawValue,
    DeviceiPad.iPadAir2.rawValue,
    DeviceiPad.iPadMini.rawValue,
    DeviceiPad.iPadMini2.rawValue,
    DeviceiPad.iPadMini3.rawValue,
    DeviceiPad.iPadMini4.rawValue:
        adjustCountTitles()
    case DeviceiPad.iPadPro.rawValue:
        adjustCountNumbers()
    default: break
    }