Swift - 如何使整数符合 D6?

Swift - How to make an integer conform to a D6?

我想知道如何使 Int 符合 d6(模具值)。

我想通过协议来做;但我不太确定如何让 Int 遵循 d6 的规则;也就是说,

Context:我有一个程序,其中有一个 orders 数组,其中填充了由 Gameplaykit 生成的随机 d6 创建的整数.

根据:

// Fill array with 3 existingOrders
let orders = [Order(), Order(), Order()]

orders.forEach { (order) in
    print (order.value)
}

// Order struct ---- 
struct Order {
    enum State: Int {
        case existingOrder = 0, completedOrder
    }

    private (set) var value: Int // I want this value to conform to a `d6` protocol

   var state: Order.State

      init() {
          self.value = Die.roll
          self.state = .existingOrder
      }

 }

利用 Gameplaykit,我们生成一个随机数

 struct Die: Equatable {
    public static var roll: Int {
       let d6 = GKRandomDistribution.d6()
       return (d6.nextInt())
    }
}

所以我想让 Order 结构中的 value 符合 d6 协议。

起初我以为我可以做到这一点。

protocol Rollable {
    func roll() -> Int
}

struct D6: Rollable {
    var value: Int

    func roll() -> Int {
        let d6 = GKRandomDistribution.d6()
        return (d6.nextInt())
    }

    init() {
        self.value = roll() // throws error: self used before all stored properties
    }

    mutating func decrease(by amount: Int) {
        guard (self.value > 0) else { return }
        self.value -= amount
    }
}

然而它不是一个协议;它还会引发错误:

error: self used before all stored properties

因此,我的查询是——是否可以强制 Order 结构内的 value: Int 符合 d6 协议,其中 d6:

谢谢

编辑:尝试在关联类型中进行

protocol Die {
    associatedtype d6 = Int
    var value: d6 { get set }
    func roll() -> d6
}

不确定这是否正确

我认为您不需要此处的价值协议,而是使用依赖注入来设置要使用的 GKRandomDistribution。我的解决方案不使用您的 Rollable 协议,但您当然可以根据需要从此解决方案中提取协议。

class Dice {
    let randomDistribution: GKRandomDistribution
    private(set) var value: Int

    init(_ randomDistribution: GKRandomDistribution) {
        self.randomDistribution = randomDistribution
        value = 0
        self.roll()
    }

    func roll() {
        value = randomDistribution.nextInt()
    }

    func decrease(by amount: Int) {
        guard (self.value >= randomDistribution.lowestValue + amount) else { return }
        self.value -= amount
    }

}