我正在将一个旧的 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...
}
我的思维过程或逻辑在这里有缺陷吗? 我很困惑...任何帮助将不胜感激,谢谢!
问题是您正在将 Int16 值传递给交换机。你正在将 entry.mood(一个 Int16)设置为原始值 1,但开关需要你的心情类型。所以你有一个类型不匹配。
您可以通过将值转换为情绪来解决它:
switch Mood(rawValue: entry.mood)! {
与 Objective-C 枚举不同。在 Objective-c 中,枚举是支持值,由不同的名称引用。在 swift 中,枚举是它自己的类型,值是关联的值(如果你不想要一个支持值,你实际上不需要支持值,但在你的情况下这是有意义的)。
读一读这个,它很好地解释了事情。 https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Enumerations.html