访问非原始类型枚举案例值?

Accessing a non raw type enumerations case values?

所以我有一个枚举定义如下:

enum CardPosition {
    case top(CGFloat) 
    case middle(CGFloat)
    case bottom(CGFloat) 
}

我有一个 CardPosition 类型的变量定义为:

@State private var position: CardPosition = CardPosition.bottom(UIScreen.main.bounds.height - 100)

如何访问 CardPosition 的值?在这种情况下,我试图从枚举中访问 UIScreen.main.bounds.height - 100 值。我尝试使用

访问它
self.position.rawValue 

但不幸的是,这不起作用。任何人都知道我如何访问位置的 CGFloat 值?

这里需要用到开关:

switch position {
case .top(let f):
    // use f
case .middle(let f):
    // use f
case .bottom(let f):
    // use f
}

如果你想把它作为一个表达式,你可以这样做:

// you can assign the below to a variable or whatever
// let value =
{ () -> CGFloat in
    switch position {
    case .top(let f):
        return f
    case .middle(let f):
        return f
    case .bottom(let f):
        return f
    }
}()

但是,我认为最好的解决方案是重新设计您的类型。似乎总会有一个 CGFloat 与您的枚举的每个案例相关联。为什么不使用由简单枚举和 CGFloat 组成的结构?

enum RelativeCardPosition {
    case top
    case middle
    case bottom
}

struct CardPosition {
    let relativeCardPosition: RelativeCardPosition
    let offset: CGFloat
    
    static func top(_ offset: CGFloat) -> CardPosition {
        CardPosition(relativeCardPosition: .top, offset: offset)
    }
    
    static func middle(_ offset: CGFloat) -> CardPosition {
        CardPosition(relativeCardPosition: .middle, offset: offset)
    }
    
    static func bottom(_ offset: CGFloat) -> CardPosition {
        CardPosition(relativeCardPosition: .bottom, offset: offset)
    }
}

然后您可以通过position.offset轻松访问该号码。

您可以在 enum CardPositionreturn 中创建一个 Computed 属性 position 和每个 case,即

enum CardPosition {
    case top(CGFloat)
    case middle(CGFloat)
    case bottom(CGFloat)
    
    var position: CGFloat {
        switch self {
        case .top(let pos), .middle(let pos), .bottom(let pos):
            return pos
        }
    }
}

要获取 .bottom 变量的关联值,请使用 if let case 语法

var position: CardPosition = CardPosition.bottom(UIScreen.main.bounds.height - 100.0)

if case let CardPosition.bottom(positionValue) = position {
    print(positionValue)
}

这只会为您提供 .bottom 的值,而不会为任何其他枚举情况提供值。