Swift:无法打开枚举关联值

时间:2014-11-26 10:43:16

标签: ios core-data swift enums

我将旧的Objective C应用程序转换为SWIFT用于学习目的,并且在尝试在枚举上提供switch语句时偶然发现了一个奇怪的问题。

代码如下所示:

switch entry.mood {
    case let Mood.THDiaryMoodGood:
        self.moodImageView.image = UIImage(named: "icn_happy")
    case let Mood.THDiaryMoodAverage:
         self.moodImageView.image = UIImage(named: "icn_average")
    case let Mood.THDiaryMoodBad:
        self.moodImageView.image = UIImage(named: "icn_bad")
    default:
        self.moodImageView.image = UIImage(named: "icn_happy")
}

情绪在哪里:

enum Mood: Int16 {
    case THDiaryMoodGood = 0
    case THDiaryMoodAverage = 1
    case THDiaryMoodBad = 2
}

心情中的表示存储在名为mood的CoreData实体中,类型为Integer 16

我的演员阵容直接匹配,但是当我尝试使用上面提供的switch语句时,我收到错误:Enum case pattern cannot match values of the non-enum type Int16

我很困惑为什么我收到这个错误,根据我的理解,这个过程应该像这样评估:

entry.mood = 1

switch(1) {
   // Int16: 0 returned from enum - would evaluate false and fall through to case B
   case Mood.THDiaryMoodGood:   
        self.mood.image = ...   
   // Int16: 1 returned from enum - would evaluate true and set the icon
   case Mood.THDiaryMoodAverage:
        self.mood.image = ...
   // Other cases not evaluated as we returned true...
}

我的思维过程或逻辑是否存在缺陷?我非常困惑......非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

问题是您正在将Int16值传递给交换机。你将entry.mood(一个Int16)设置为原始值1,但是开关需要你的Mood类型。所以你的类型不匹配。

您可以通过将值转换为心情来解决它:

switch Mood(rawValue: entry.mood)! {

答案 1 :(得分:1)

Swift枚举与Objective-C枚举不同。在Objective-c中,枚举是支持值,由不同的名称引用。在swift中,枚举是它自己的类型,值是一个相关的值(如果你不想要一个,你实际上不需要一个支持值,在你的情况下它是有道理的)。

阅读本文,它解释得非常好。 https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Enumerations.html