包含自定义对象原始值

时间:2017-07-10 16:42:55

标签: ios swift enums

我尝试为我的ViewController实现一个状态机,所以我创建一个枚举来表达我的ViewController的可能状态:

enum SMState:RawRepresentable{
    case empty,data(UIView),failed(UIView),noData(UIView)
}
  • enum的4状态适用于我的ViewController,有些状态与自定义视图关联,以显示ViewController何时进入指定状态。
  • 然后我制作了SMState impl RawRepresentable协议
enum SMState:RawRepresentable{
        case empty,data(UIView),failed(UIView),noData(UIView)
        typealias RawValue = UIView

    init?(rawValue: SMState.RawValue) {
        // rawValue is a view but i can't judge what to return
        return what???
    }

    var rawValue: UIView{
        switch self {
        case .data(let v):
            return v
        case .failed(let v):
            return v
        case .noData(let v):
            return v
        case .empty:
            return UIView()
        }
    }
}

我应该如何实现上述init?(rawValue:SMState.RawValue)功能,我无法想象如何执行此操作。

更新

为什么我实施RawRepresentable

我认为enum更适合ViewController代替Class or Struct的可表示的不同状态,但enum不能包含stored property,它只能携带UIView通过RawRepresentable对象,欢迎任何更好的主意或魔法:D

2 个答案:

答案 0 :(得分:0)

@Hamish你是对的,我不应该坚持使用RawRepresentable,经过一段美好的睡眠,我最终归档了我想要的东西:

//: Playground - noun: a place where people can play

import UIKit

enum SMState{
    case empty,data(UIView),failed(UIView),noData(UIView)
}

extension SMState{
    init() {
        self = .empty
    }
    init(failed view:UIView) {
        self = .failed(view)
    }
    init(data view:UIView) {
        self = .data(view)
    }
    init(noData view:UIView) {
        self = .noData(view)
    }
}

let state = SMState(failed: UIView())


switch state {

case .failed(let v):
    print(v)

default:break

}
  1. 这就是我想要的,每个enum州拥有一个单独的View,我在不同的状态下做不同的操作,使用状态携带的View
  2. 这种方法很像使用Class,在我的情况下,我不确定可能会有更多的状态,那么就不可能扩展或子类化SMState,因为它是{{1}我考虑使用enum
  3. 我想要做的就像这个库StatefulViewController,我想让它更灵活。
  4. 欢迎任何建议〜

    :d

答案 1 :(得分:0)

您已经可以使用特定的状态机而不是发明轮子:GKStateMachine。它具有从状态转换到状态所需的所有方法。我们还将它用于不同的视图控制器状态。花点时间阅读一下,找一些例子,让你的代码变得干净整洁。您还可以将实现与相应的状态枚举相结合,这些状态只需定义状态而无需在那里具有关联值。