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。我想检查该字符串是否与两个枚举原始值(也是字符串)中的任何一个匹配。
guard
抛弃您。错误与if
guard
有效。添加第二个会引发错误。一直试图弄清楚为什么它会将String值视为Bool。也搜索了一下,但没有在其他地方看到这个问题。
有什么想法吗?
答案 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的值。
当然,你想要避免这个
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) || z
。 z
完全是寂寞的,并没有与任何东西相比。有些语言允许使用它,但大多数语言都没有。
答案 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
}