使用NSLog记录Swift枚举

时间:2014-06-05 13:36:50

标签: swift nslog

我正在尝试记录枚举:

enum CKAccountStatus : Int {
    case CouldNotDetermine
    case Available
    case Restricted
    case NoAccount
}

NSLog("%i", CKAccountStatus.Available)

编译器抱怨:

Type 'CKAccountStatus' does not conform to protocol 'CVarArg'

为什么呢?我试图抛出价值:

NSLog("%i", CKAccountStatus.Available as Int)

但这也不会飞:

Cannot convert the expression's type '()' to type 'String'

7 个答案:

答案 0 :(得分:28)

获取枚举的基础Int值:CKAccountStatus.Available.rawValue

在Swift中,枚举不是严格的整数,但是如果它们用基础类型声明,你可以用rawValue得到它 - 无论底层类型是什么。 (enum Foo: String会为rawValue等提供字符串。)如果枚举没有基础类型,则rawValue没有任何内容可供您使用。在从ObjC导入的API中,任何使用NS_ENUM定义的枚举都有一个基础整数类型(通常为Int)。

如果您想更具描述性地打印任何枚举,可以考虑对采用Printable协议的枚举类型进行扩展。

答案 1 :(得分:7)

枚举实际上是不透明的。它可能有原始值,你可以得到;但很多枚举都没有。 (你不必将枚举声明为有类型,如果你没有,则没有原始值。)我要做的是给枚举description方法并调用明确地说。

区分枚举当前值的唯一方法是通过switch语句,因此您的description方法将处理每种情况,并且switch语句的每个case都将返回不同的描述值。 / p>

enum Suit {
    case Hearts, Diamonds, Spades, Clubs
    func description () -> String {
        switch self {
        case Hearts:
            return "hearts"
        case Diamonds:
            return "diamonds"
        case Spades:
            return "spades"
        case Clubs:
            return "clubs"
        }
    }
}

var suit = Suit.Diamonds
println("suit \(suit.description())")  // suit diamonds

答案 2 :(得分:5)

这是我的方法:

enum UserMode : String
{
   case Hold = "Hold";
   case Selecting = "Selecting";
   case Dragging = "Dragging";
}

然后,每当我需要打印原始值时:

//Assuming I have this declared and set somewhere
var currentMode: UserMode = .Selecting;

否则

NSLog("CurrentMode \(_currMode.rawValue)");

将打印:

CurrentMode选择

答案 3 :(得分:1)

来自Swift文档:

  

如果您熟悉C,您将知道C枚举将相关名称分配给一组整数值。 Swift中的枚举更加灵活,并且不必为枚举的每个成员提供值。如果为每个枚举成员提供了一个值(称为“原始”值),则该值可以是字符串,字符或任何整数或浮点类型的值。

因此,您无法尝试将其强制转换为Int。就你的第一个问题而言,似乎NSLog()正在寻找一个C-variable类型的参数,它不适用于Swift枚举。

答案 4 :(得分:0)

我知道,枚举不是Swift中的数字:

  

与C和Objective-C不同,Swift枚举成员未分配   创建时的默认整数值。在CompassPoints中   上面的例子,北,南,东和西不隐含地等于0,   1,2和3.相反,不同的枚举成员是   完全成熟的价值观,具有明确定义的价值   CompassPoint的类型。

有没有办法轻松记录价值呢?啊,有:

NSLog("%i", CKAccountStatus.Available.toRaw())

答案 5 :(得分:0)

您可以使用toRaw()函数获取枚举的Int-Value,如下所示:

import Foundation

enum CKAccountStatus : Int {
    case CouldNotDetermine
    case Available
    case Restricted
    case NoAccount
}

let block = {(status: Int) -> Void in
    NSLog("%d", status)
}

let status = CKAccountStatus.Available.toRaw()
block(status) // prints "1"

答案 6 :(得分:0)

对于我的错误枚举,我使用

public var localizedDescription : String { return String(reflecting: self) }

对于其他枚举,可以使用CustomStringConvertible协议

public var description : String { return String(reflecting: self) }