如何确定Swift枚举中的个案数?
(我想避免手动枚举所有值,或者尽可能使用旧的" enum_count技巧 ".)
在Objective-C中,可以description向其类添加一个方法以帮助调试:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后在调试器中,您可以执行以下操作:
po fooClass
<MyClass: 0x12938004, foo = "bar">
Run Code Online (Sandbox Code Playgroud)
Swift中的等价物是什么?Swift的REPL输出可能会有所帮助:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Run Code Online (Sandbox Code Playgroud)
但我想重写此行为以打印到控制台:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Run Code Online (Sandbox Code Playgroud)
有没有办法清理这个println输出?我见过Printable协议:
/// This protocol should be adopted by types that wish …Run Code Online (Sandbox Code Playgroud) 语言指南没有透露列表理解的痕迹.在Swift中实现这一目标的最佳方法是什么?我正在寻找类似的东西:
evens = [ x for x in range(10) if x % 2 == 0]
Run Code Online (Sandbox Code Playgroud) 有没有办法在数组中获取枚举的所有值?
假设我有以下代码:
enum Suit {
case Spades, Hearts, Diamonds, Clubs
}
Run Code Online (Sandbox Code Playgroud)
是否有方法来获取以下数组?
[Spades, Hearts, Diamonds, Clubs]
Run Code Online (Sandbox Code Playgroud) 是否可以在Swift中循环枚举值?或者替代方案是什么?
我正在使用Apple的Swift语言指南,我在枚举上遇到了这个例子.
// EXPERIMENT
//
// Add a method to Card that creates a full deck of cards,
// with one card of each combination of rank and suit.
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return …Run Code Online (Sandbox Code Playgroud) 我有一种情况,我正在尝试对某些数据进行二进制解码,数据类型同时具有数值和字符串值以及名称.我正在考虑使用如下的枚举:
enum TARGET_TRACK_TYPE : String {
case TT_INVALID = "Invalid"
case TT_TRUE_TRACK_ANGLE = "True Track Angle"
case TT_MAGNETIC = "Magnetic"
case TT_TRUE = "True"
}
Run Code Online (Sandbox Code Playgroud)
但是我也知道:
TT_INVALID = 0并且TT_TRUE_TRACK_ANGLE = 1,等有没有一种简单的方法来封装这两个"东西"的字符串和数值到枚举结构或做我需要做某种结构的/类来处理呢?
我想我想做点什么
let a = TARGET_TRACK_TYPE.rawValue(value: 2)
println(a)
哪个会打印 True Track Angle
同样,我知道这可以用结构或类来完成,但我对枚举特别感兴趣
或者换个例子:
/// Emitter Category is defined in section 3.5.1.10 of the GDL90 Spec
struct EmitterCategory {
let category : Int
func getString() -> String {
switch(category) {
case 0:
return "No aircraft type information"; …Run Code Online (Sandbox Code Playgroud) 我在xcode 9.3和xcode 10 beta 3游乐场中运行此代码
import Foundation
public protocol EnumCollection: Hashable {
static func cases() -> AnySequence<Self>
}
public extension EnumCollection {
public static func cases() -> AnySequence<Self> {
return AnySequence { () -> AnyIterator<Self> in
var raw = 0
return AnyIterator {
let current: Self = withUnsafePointer(to: &raw) { $0.withMemoryRebound(to: self, capacity: 1) { $0.pointee } }
guard current.hashValue == raw else {
return nil
}
raw += 1
return current
}
}
}
}
enum NumberEnum: EnumCollection{
case …Run Code Online (Sandbox Code Playgroud) 枚举有一个名为'hashValue'的属性,它是枚举中的索引.
现在我的问题是,是否可以通过使用数字来访问其值?例如:let variable:AnEnum = 0
给出一个Swift枚举:
enum PerformerPosition: Int {
case String_Violin1
case String_Violin2
case String_Viola
case String_Cello
case String_CB
case Wind_Oboe
case Wind_Clarinet
case Wind_Flute
...
}
Run Code Online (Sandbox Code Playgroud)
(对于项目的需要,我无法使用嵌套枚举.)我想只选择带String_前缀的枚举值.
到目前为止,我所知道的唯一方法是从所有可用的案例中执行随机枚举值,如下所示:
private static let _count: PerformerPosition.RawValue = {
// find the maximum enum value
var maxValue: Int = 0
while let _ = PerformerPosition(rawValue: maxValue) {
maxValue += 1
}
return maxValue
}()
static func randomPerformer() -> PerformerPosition {
// pick and return a new value
let rand = arc4random_uniform(UInt32(count))
return PlayerPosition(rawValue: …Run Code Online (Sandbox Code Playgroud) 我要做的是创建一个协议扩展来从枚举中获取原始值数组.例如,说我有以下内容:
enum TestType: String, EnumIteratable {
case unitTest = "Unit Test"
case uiTest = "UI Test"
}
class EnumIterator: NSObject {
class func iterateEnum<T: Hashable>(_: T.Type) -> AnyGenerator<T> {
var i = 0
return anyGenerator {
let next = withUnsafePointer(&i) { UnsafePointer<T>($0).memory }
return next.hashValue == i++ ? next : nil
}
}
class func getValues<T: Hashable>(_: T.Type) -> [T] {
let iterator = self.iterateEnum(T)
var returnArray = [T]()
for val in iterator {
returnArray.append(val)
}
return returnArray
}
} …Run Code Online (Sandbox Code Playgroud)