我正在尝试记录枚举:
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'
答案 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) }