Swift 如何从枚举案例的特定实例中提取关联值?

Swift 如何从枚举案例的特定实例中提取关联值?,swift,enums,associated-object,Swift,Enums,Associated Object,考虑一下这个枚举 enum SelectionMode { case none (position:TextPosition) case normal (startPosition:TextPosition, endPosition:TextPosition) case lines (startLineIndex:Int, endLineIndex:Int) } 如果它被传递到一个函数中,您可以使用switch语句,每个case都接收相关的值,如下所示

考虑一下这个枚举

enum SelectionMode {
    case none     (position:TextPosition)
    case normal   (startPosition:TextPosition, endPosition:TextPosition)
    case lines    (startLineIndex:Int, endLineIndex:Int)
}
如果它被传递到一个函数中,您可以使用switch语句,每个case都接收相关的值,如下所示

let selectionMode:SelectionMode = .lines(4, 6)

switch sectionMode {
    case let .none   (position): break;
    case let .normal (startPosition, endPosition): break;
    case let .lines  (startLineIndex, endLineIndex):
        // Do something with the indexes here

}
我想知道的是,如果我知道,例如,我被交给了一个“.lines”版本,我如何在不使用switch语句的情况下获得相关的值

i、 我可以这样做吗

let selectionMode:SelectionMode = .lines(4, 6)

let startLineIndex = selectionMode.startLineIndex

那么类似的事情是否可能发生呢?

没有任何运行时检查的简单赋值将不起作用,因为 编译器无法知道selectionMode变量包含的值。 如果程序逻辑保证它是.line,那么 您可以通过模式匹配提取关联的值:

guard case .lines(let startLineIndex, _) = selectionMode else {
    fatalError("Expected a .lines value")
    // Or whatever is appropriate ...
}

完美的正是我想要的。谢谢太神了这甚至适用于if语句。如果case.lineslet startIneIndex,{uu=selectionMode{//do stuff}