我正在尝试记录枚举:
enum CKAccountStatus : Int {
case CouldNotDetermine
case Available
case Restricted
case NoAccount
}
NSLog("%i", CKAccountStatus.Available)
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
Type 'CKAccountStatus' does not conform to protocol 'CVarArg'
Run Code Online (Sandbox Code Playgroud)
为什么?我试图抛出价值:
NSLog("%i", CKAccountStatus.Available as Int)
Run Code Online (Sandbox Code Playgroud)
但这也不会飞:
Cannot convert the expression's type '()' to type 'String'
Run Code Online (Sandbox Code Playgroud)
ric*_*ter 28
得到枚举的基本Int
价值:CKAccountStatus.Available.rawValue
.
枚举在Swift中不是严格的整数,但是如果它们被声明为底层类型,你可以得到它rawValue
- 无论底层类型是什么.(enum Foo: String
会为你提供字符串rawValue
等)如果枚举没有基础类型,rawValue
则没有什么可以给你.在从ObjC导入的API中,任何定义的枚举NS_ENUM
都具有基础整数类型(通常Int
).
如果您想更具描述性地打印任何枚举,可以考虑对采用该Printable
协议的枚举类型进行扩展.
枚举实际上是不透明的.它可能有原始值,你可以得到; 但许多枚举没有.(您不必将枚举声明为具有类型,如果不是,则没有原始值.)我要做的是给枚举一个description
方法并明确地调用它.
区分枚举当前值的唯一方法是通过switch语句,因此您的description
方法将处理每种情况,并且switch语句的每个case将返回不同的描述值.
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
Run Code Online (Sandbox Code Playgroud)
这是我的方法:
enum UserMode : String
{
case Hold = "Hold";
case Selecting = "Selecting";
case Dragging = "Dragging";
}
Run Code Online (Sandbox Code Playgroud)
然后,每当我需要打印原始值时:
//Assuming I have this declared and set somewhere
var currentMode: UserMode = .Selecting;
Run Code Online (Sandbox Code Playgroud)
干
NSLog("CurrentMode \(_currMode.rawValue)");
Run Code Online (Sandbox Code Playgroud)
将打印:
CurrentMode选择