Обработка нескольких состояний в быстром - PullRequest
1 голос
/ 17 апреля 2019

У меня есть таблица, которая должна обрабатывать 9 различных состояний. У меня есть два раздела, которые содержат разные модели данных (A, B) Эти два раздела имеют логические зависимости друг от друга

1) !A.isEmpty
2) !B.isEmpty
3) A show expandable footer (A.count > 5)
4) B show expandable footer (B.count > 5)
5) A shows collapsable footer (user clicked on A.expandable footer)
6) B shows collapsable footer (user clicked on B.expandable footer
7) A.count > 3 && B.isEmpty
8) B.count > 3 && A.isEmpty
9) A.count > 3 && B.isEmpty && A shows collapsable footer (user clicked on A.expandable footer)

Существует ли стандарт для обработки нескольких состояний? Я думаю о создании какой-либо государственной структуры. Что такое «Промышленный стандарт» для решения этой проблемы?

Это то, что я сейчас использую - Многие вычислительные переменные

let numberOfCells = 5
var A.expanded = false
var B.expanded = false
var A = [Data]()
var B = [Data]()
var state5 = A.expanded
var state6 = B.expanded

var A.showFooter: Bool {
    return A.count > numberOfCells
}
var B.showFooter: Bool {
    return B.count > numberOfCells
}
var state7: Bool {
    return A.showFooter && B.isEmpty
}
var state8: Bool {
    return A.isEmpty && B.showFooter
}
var state9: Bool {
    return (state7 && state6)
        || (state8 && state5)
}

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я решил использовать объект для хранения логики и битовой маскировки, чтобы действовать как состояния.

private struct StateModel: OptionSet {
    let rawValue: Int

    static let AIsEmpty = StateModel(rawValue: 1 << 0)
    static let AHasValues = StateModel(rawValue: 1 << 1)
    static let BIsEmpty = StateModel(rawValue: 1 << 2)
    static let BHasValues = StateModel(rawValue: 1 << 3)
    static let AFooterIsVisible = StateModel(rawValue: 1 << 4)
    static let BIsVisible = StateModel(rawValue: 1 << 5)
    static let AFooterIsExpanded = StateModel(rawValue: 1 << 6)
    static let BFooterIsExpanded = StateModel(rawValue: 1 << 7)
    static let AFooterShowsCTA: StateModel = [.AHasValues, .BIsEmpty]
    static let BFooterShowCTA: StateModel = [.AIsEmpty, .BHasValues]
    static let ACTAAsCell: StateModel = [.AFooterShowsCTA, .AFooterIsVisible]
    static let BCTAAsCell: StateModel = [.BFooterShowCTA, .BFooterIsExpanded]
}

class Logic {

var stateModel: StateModel = []

//Should AFooter show CTA?
var showAFooter: Bool {
  stateModel.contains(.AFooterShowsCTA)
}

}
0 голосов
/ 17 апреля 2019

Я думаю, что enum или struct будет соответствовать вашим потребностям.

struct Video {
enum State {
    case willDownload(from: URL)
    case downloading(task: Task)
    case playing(file: File, progress: Double)
    case paused(file: File, progress: Double)
}

var state: State

}

    private func resolveActionButtonImage() -> UIImage {
    // The image for the action button is declaratively resolved
    // directly from the video state
    switch video.state {
        // We can easily discard associated values that we don't need
        // by simply omitting them
        case .willDownload:
            return .wait
        case .downloading:
            return .cancel
        case .playing:
            return .pause
        case .paused:  
            return .play
    } 
}

}

Ссылка: https://www.swiftbysundell.com/posts/modelling-state-in-swift

...