我在Swift编写我的第一个项目(我已经做了多年的ObjectiveC),由于某些原因,我无法解决为什么我的枚举和Switch没有工作的问题
enum ContactViewMode : Int
{
case ViewModeFavourite = 0
case ViewModeRecent = 1
case ViewModeContacts = 2
}
属性
@IBInspectable var contactViewMode : Int!
切换
switch contactViewMode {
case ContactViewMode.ViewModeFavourite:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case ContactViewMode.ViewModeRecent:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}
我得到的错误是 枚举案例'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]
}
然后我明白了 枚举案例模式无法匹配非枚举类型“Int”
的值答案 0 :(得分:27)
您必须将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]
}
但除非你有充分的理由,否则我不建议
答案 1 :(得分:22)
其他答案未能利用Swift的强力打字。请注意,他们在 /*
* This is a manifest file that'll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
*
* You're free to add application-wide styles to this file and they'll appear at the top of the
* compiled file, but it's generally better to create a new file per style scope.
*
*= require fullcalendar
*= require_self
*= require jquery.ui.all
*= require_tree .
*/
#banner {
background: #282827;
padding: 10px;
border-bottom: 2px solid;
font: small-caps 20px/20px "Times New Roman", serif;
color: #141414;
text-align: left;
img {
float: left;
}
}
#notice {
color: #000 !important;
border: 2px solid red;
padding: 1em;
margin-bottom: 2em;
background-color: #f0f0f0;
font: bold smaller sans-serif;
}
#columns {
background: #646462;
#main {
margin-left: 17em;
padding: 2em;
background: white;
}
#side {
color: red;
float: left;
padding: 1em 2em;
width: 13em;
background: #646462;
ul {
padding: 0;
li {
list-style: none;
a {
color: #bfb;
font-size: small;
}
}
}
}
}
中都有default
个案例。然而,Swift在编译时知道你是否覆盖了switch
的所有情况,因此不需要enum
这种情况。
这是该语言的一个有用功能。想象一下,您稍后会在default
添加额外的case
。编译器会抱怨并指向不考虑该特定enum
的所有switch
。
那么我们怎样才能利用Swift的强力打字呢?
首先,让我们修复枚举的命名。我假设您将它嵌套在case
类中(并且与Objective-C不同,它应该在中),您可以简单地命名ContactView
{ {1}}。在案例中也不需要提及enum
。通过这种方式,您可以获得更清洁,更惯用的类型。
Mode
我们需要做的是在ViewMode
上执行enum Mode: Int {
case favourite
case recent
case contacts
}
,而不是switch
。您的Mode
是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 */
}
,然后再启用它。
答案 2 :(得分:6)
这对我有用:
我有一个这样的枚举:
enum Proximity{
case Unknown
case Immediate
case Near
case Far
}
然后是一个看起来像这样的开关:
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
}
我循环遍历" b"具有邻近属性的对象。
答案 3 :(得分:4)
枚举是类型。只是因为您明确表示单个枚举值可以转换为Int
并不能使contactViewMode
Int!
声明为有效。这些类型根本不匹配。
因此,要么将contactViewMode
声明为ContactViewMode
,请使用您的第一个switch
语句,并在实际需要故事板时转换为Int!
,或使用第二个{{} 1}},但不要使用switch
等,而是使用相应的.ViewModeFacourite
值。
Int
答案 4 :(得分:3)
您无法直接将Int
与enum
匹配。相反,您必须使用ContactViewMode
属性将Int
转换为.rawValue
,或使用Int
初始化程序将ContactViewMode
转换为init(rawValue:)
。
后一个例子:
switch ContactViewMode(rawValue: contactViewMode) {
case .Some(.ViewModeFavourite):
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case .Some(.ViewModeRecent):
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}
因为ContactViewMode(rawValue:)
会返回Optionals,我们需要.Some()
。
答案 5 :(得分:1)
您可以简单地使用contactViewMode并创建一个ContactViewMode
类型的新var,以防contactViewMode
的值来自其他地方且必须为int
。
let contactMode :ContactViewMode = ContactViewMode(rawValue: contactViewMode)!
现在您可以轻松使用如下所示的开关:
switch contactMode {
case .ViewModeFavourite:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case .ViewModeRecent:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}