我在Swift编写我的第一个项目(我已经做了多年的ObjectiveC)并且出于某种原因,我无法解决为什么我的枚举和Switch没有工作的问题
enum ContactViewMode : Int
{
case ViewModeFavourite = 0
case ViewModeRecent = 1
case ViewModeContacts = 2
}
Run Code Online (Sandbox Code Playgroud)
属性
@IBInspectable var contactViewMode : Int!
Run Code Online (Sandbox Code Playgroud)
开关
switch contactViewMode {
case ContactViewMode.ViewModeFavourite:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case ContactViewMode.ViewModeRecent:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是 Enum case'ViewModeFavourite'不是'Int!'类型的成员
所以我改为它,因为它不是Int!(我需要Int!for Storyboard)
var contactMode:Int = contactViewMode
switch contactMode {
case .ViewModeFavourite:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case .ViewModeRecent:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}
Run Code Online (Sandbox Code Playgroud)
然后我得到 Enum案例模式不能匹配非枚举类型'Int'的值
Ant*_*nio 28
您必须声明contactViewMode的ContactViewMode,而不是Int.
如果您真的想要它Int,那么您必须通过将变量rawValue与枚举案例的属性进行比较来更改开关中的案例:
switch contactViewMode {
case ContactViewMode.ViewModeFavourite.rawValue:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case ContactViewMode.ViewModeRecent.rawValue:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}
Run Code Online (Sandbox Code Playgroud)
但除非你有充分的理由,否则我不建议
Qui*_*oya 24
其他答案未能利用Swift的强力打字.请注意,他们都有一个default案例switch.然而,Swift在编译时知道你是否已经覆盖了所有的情况enum,因此default不需要渲染.
这是该语言的一个有用功能.想象一下,你添加一个额外的case给你enum在稍后的点.编译器会抱怨并指出所有switch不考虑该特定内容的es case.
那么我们怎样才能利用Swift强大的打字?
首先,让我们修复枚举的命名.我假设你将它嵌套在一个ContactView类中(而且,与Objective-C不同,它应该真的在它里面),你可以enum简单地命名Mode.也不需要ViewMode在案例中提及.通过这种方式,您可以获得更清洁,更惯用的类型.
enum Mode: Int {
case favourite
case recent
case contacts
}
Run Code Online (Sandbox Code Playgroud)
我们需要做的是执行switcha Mode,而不是on Int.你Mode是RawRepresentable,你可以这样做:
guard let m = Mode(rawValue: contactViewMode) else { /* handle the situation */ }
switch m {
case .favourite: /* handle case */
case .recent: /* handle case */
case .contacts: /* handle case */
}
Run Code Online (Sandbox Code Playgroud)
这就是它的全部 - 而不是打开它rawValue,先获得正确Mode然后再打开它.
这对我有用:
我有这样的枚举:
enum Proximity{
case Unknown
case Immediate
case Near
case Far
}
Run Code Online (Sandbox Code Playgroud)
然后是一个如下所示的开关:
switch b.proximity as Proximity {
case Proximity.Immediate:
if b.rssi == -30 && b.accuracy == 0.2345{
closestBeacon = b
}
case Proximity.Near:
return
case Proximity.Far:
return
default:
return
}
Run Code Online (Sandbox Code Playgroud)
我循环遍历具有邻近属性的"b"对象数组.
| 归档时间: |
|
| 查看次数: |
18361 次 |
| 最近记录: |