首页 > 解决方案 > Swift - 如何使整数符合 D6?

问题描述

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

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

上下文:我有一个程序,其中有一个数组orders,其中填充了d6由 Gameplaykit 随机生成的整数。

按照:

// 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())
    }
}

所以我想让valueOrder 结构中的 符合 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
    }
}

但是它不是协议;它也会引发错误:

错误:在所有存储属性之前自我使用

因此,我的查询是 - 是否可以强制结构value: Int内部Order符合d6d6:

感谢

编辑:尝试在关联类型中执行此操作

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

不确定这是否正确

标签: swiftintswift-protocolsdice

解决方案


我认为您在这里不需要价值协议,而是使用依赖注入来设置要使用的 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
    }

}

推荐阅读