簡體   English   中英

具有自定義對象原始值的Swift枚舉

[英]Swift enum with custom object raw value

我嘗試為ViewController實現狀態機,所以我創建了一個枚舉來表達ViewController的可能狀態:

enum SMState:RawRepresentable{
    case empty,data(UIView),failed(UIView),noData(UIView)
}
  • 枚舉的4狀態適合我的ViewController,並且某些狀態與自定義視圖相關聯,以在ViewController進入指定狀態時顯示。
  • 然后我使SMState 隱含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 ,它只能通過RawRepresentable攜帶UIView Object,歡迎任何更好的主意或魔術:D

@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因為它是一個enum ,我正在考慮使用Class
  3. 我想做的事情很像這個庫StatefulViewController ,我想使其更加靈活。

任何建議都歡迎〜

:d

您已經可以使用一種特定的狀態機來代替發明輪子: GKStateMachine 它具有從狀態轉換到狀態的所有必需方法。 我們還將它用於不同的視圖控制器狀態。 只需花一些時間閱讀一下並找到一些示例,以使您的代碼簡潔明了。 您還可以將實現與相應的狀態枚舉結合起來,狀態枚舉僅定義狀態而無需在此處具有關聯的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM