swift - Swift - 如何使整数符合 D6?
问题描述
我想知道如何使一个Int
符合d6
(模具值)。
我想通过协议来做到这一点;但我不太确定如何使 Int 遵循 d6 的规则;也就是说,
- Int 只能在 1-6 范围内
- 该值可以减小,但只能在 1-6 范围内
- 它可以“滚动”(实际上:随机生成一个值)
上下文:我有一个程序,其中有一个数组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())
}
}
所以我想让value
Order 结构中的 符合 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
符合d6
d6:
- 必须在 1-6 之间
- 可在 1-6 之间减小值
- 可以滚动(生成一个随机的新骰子)
感谢
编辑:尝试在关联类型中执行此操作
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
}
}
推荐阅读
- python - 熊猫按不规则日期范围分组
- flutter - Flutter & Geocoder & Geolocator : 如何获取英文国家名称?
- pytorch - PyTorch:type(a)、a.type、a.type() 之间的区别
- python - 使用 webpack-quasar 在 Django 服务器中共享静态文件
- jenkins - Jenkins - Throttle 并发构建插件
- python - 请解释 re 模块在这种情况下是如何工作的, re.sub() 和 re.findall 似乎给出了不同的匹配
- amazon-web-services - 如何查看 EC2 实例中的文件和目录?
- ruby-on-rails - Rails 最小测试。当 Exception 类是私有的时,检查是否引发异常的正确方法是什么?
- java - 如何在java中将元素向左移动1
- python - 将python转换为c编程