我尝试为我的ViewController实现一个状态机,所以我创建一个枚举来表达我的ViewController的可能状态:
enum SMState:RawRepresentable{
case empty,data(UIView),failed(UIView),noData(UIView)
}
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
答案 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
}
enum
州拥有一个单独的View
,我在不同的状态下做不同的操作,使用状态携带的View
〜Class
,在我的情况下,我不确定可能会有更多的状态,那么就不可能扩展或子类化SMState
,因为它是{{1}我考虑使用enum
欢迎任何建议〜
答案 1 :(得分:0)
您已经可以使用特定的状态机而不是发明轮子:GKStateMachine。它具有从状态转换到状态所需的所有方法。我们还将它用于不同的视图控制器状态。花点时间阅读一下,找一些例子,让你的代码变得干净整洁。您还可以将实现与相应的状态枚举相结合,这些状态只需定义状态而无需在那里具有关联值。