我喜欢Swift,但它的数字类型转换怪癖开始让我发疯...
为什么以下代码导致LogLevel is not convertible to UInt8 error
(在if语句中)?
import Foundation;
enum LogLevel : Int
{
case System = 0;
case Trace = 1;
case Debug = 2;
case Info = 3;
case Notice = 4;
case Warn = 5;
case Error = 6;
case Fatal = 7;
}
class Log
{
struct Static
{
static var enabled:Bool = true;
static var filterLevel:LogLevel = LogLevel.System;
}
public class func trace(data:AnyObject!)
{
if (Static.filterLevel > LogLevel.Trace) {return;}
println("\(data)");
}
}
Int类型的LogLevel毕竟应该等于Int。
类型的LogLevel答案 0 :(得分:3)
“Swift中的枚举本身就是一流的类型。 “
摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
因此,枚举不是一个int,对它进行数学比较是没有意义的。您已将原始值与枚举值相关联,因此您需要使用toRaw
和fromRaw
函数来访问原始值。
public class func trace(data:AnyObject!)
{
if (Static.filterLevel.toRaw() > LogLevel.Trace.toRaw()) {return;}
println("\(data)");
}
答案 1 :(得分:1)
来自Swift book:
使用
toRaw
和fromRaw
函数在原始值之间进行转换 和枚举值。
在你的情况下:
if Static.filterLevel.toRaw() > LogLevel.Trace.toRaw() {
return;
}