Swift - 如何管理转单管理?

Swift - How to manage turn order management?

我正在开发一款依赖回合顺序的本地游戏。

规则;

我不确定如何管理这些数据。有很多事情要跟踪。

  1. 我们所处的阶段
  2. 当前回合的玩家
  3. 当所有玩家都完成他们的回合时
  4. 当回合顺序结束时,我们可以进入下一阶段。
  5. 所有阶段完成后重置所有回合完成

我认为订阅模式是最好的方法,但我不习惯这种模式。

目前,我正在使用与待办事项类似的系统,其中可以将阶段本身标记为完成或未完成。

这是我目前在 Swift playground 中处理转弯顺序和阶段的方式。

// Turn order management

class TurnOrderManager: NSObject
{
    static var instance = TurnOrderManager()

    var turnOrder: [Player] = [Player]()
    private var turnOrderIndex = 0

    var current: Player {
        return turnOrder[turnOrderIndex]
    }

    func next() {
        if (self.turnOrderIndex < (self.turnOrder.count-1)) {
            turnOrderIndex += 1
        }
        else {
            print("Reached end of line")
        }
    }
}

class Player: NSObject {
    var name: String = ""

    override var description: String {
        return self.name
    }

    init(name: String) {
        super.init()
        self.name = name
    }
}

let p1:Player = Player.init(name: "Bob")
let p2:Player = Player.init(name: "Alex")

TurnOrderManager.instance.turnOrder = [p1,p2]
print (TurnOrderManager.instance.current)

TurnOrderManager.instance.next()
print (TurnOrderManager.instance.current)

TurnOrderManager.instance.next()
print (TurnOrderManager.instance.current)

// --------------------------------

// Phase management
enum PhaseType: Int {
    case buying = 1
    case selling
}

struct Phase {
    var id: PhaseType
    var title: String
    var completed: Bool = false {
        didSet {
            // Notify subscribers of completion
            guard completed else { return }
            handlers.forEach { [=12=](self) }
        }
    }

    var description:String {
        return "Phase: \(self.title), completed: \(completed)"
    }

    // Task queue
    var handlers = [(Phase) -> Void]()

    init(id: PhaseType, title: String, initialSubscription: @escaping (Phase) -> Void =
        {_ in})
    {
        self.id = id
        self.title = title
        subscribe(completion: initialSubscription)
    }

    mutating func subscribe(completion: @escaping (Phase) -> Void) {
        handlers.append(completion)
    }
}

class MyParentController {

    lazy var phase1: Phase = {
        return Phase(id: .buying, title: "Phase #1") {
            print("Do something with phase: \([=12=].title)")
        }
    }()

}

let controller = MyParentController()

controller.phase1.completed = true

问题:

我要通知:

如何让我的 TurnOrderManager 提醒 PhaseManager 当前回合已完成。

如何让我的 PhaseManager 知道当所有回合都完成后才能进入下一阶段。

对于我的查询冗长,我深表歉意。

非常感谢

您将要定义委托关系 PhaseManager 和您的 TurnOrderManager。

Here 是有关协议的 Apple 文档。

Here 是一篇关于授权的好文章。

首先您需要定义一个协议。像这样:

protocol TurnManagerDelegate {
   func complete(turn: objectType)
   func allTurnsComplete()
}

接下来您必须使您的 PhaseManager 符合协议:

class PhaseManager: TurnManagerDelegate {
   ...

   func complete(turn: objectType) {
      // implement 
   }

   func allTurnsComplete() {
      // implement 
   }
   ...
}

最后,您必须使用委托在 TurnOrderManager 上添加一个 属性:

class TurnOrderManager {
...
   var delegate: TurnManagerDelegate
...
}

并在需要时调用 TurnOrderManager 中的函数:

...
delegate?.allTurnsComplete() //example
...

在 TurnOrderManager 尝试调用任何委托方法之前,您还必须将 PhaseManager 设置为委托。