Доступ к значениям case перечислений необработанного типа? - PullRequest
0 голосов
/ 09 июля 2020

Итак, у меня есть перечисление, определенное следующим образом:

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 позиции?

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Вы можете создать вычисляемое свойство position внутри enum CardPosition и return связанного значения с каждым 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
        }
    }
}
1 голос
/ 09 июля 2020

Чтобы получить связанное значение для вашей .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, а не для других случаев перечисления.

1 голос
/ 09 июля 2020

Здесь вам нужно использовать переключатель:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...