再一次:不能转换为UInt8

时间:2014-08-03 11:57:55

标签: ios swift int uint

我喜欢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

2 个答案:

答案 0 :(得分:3)

  

“Swift中的枚举本身就是一流的类型。 “

     

摘自:Apple Inc.“The Swift Programming Language。”iBooks。   https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329

因此,枚举是一个int,对它进行数学比较是没有意义的。您已将原始值与枚举值相关联,因此您需要使用toRawfromRaw函数来访问原始值。

public class func trace(data:AnyObject!)
{
    if (Static.filterLevel.toRaw() > LogLevel.Trace.toRaw()) {return;}
    println("\(data)");
}

答案 1 :(得分:1)

来自Swift book

  

使用toRawfromRaw函数在原始值之间进行转换   和枚举值。

在你的情况下:

if Static.filterLevel.toRaw() > LogLevel.Trace.toRaw() {
    return;
}