Swift - 如何使整数符合 D6?
Swift - How to make an integer conform to a D6?
我想知道如何使 Int
符合 d6
(模具值)。
我想通过协议来做;但我不太确定如何让 Int 遵循 d6 的规则;也就是说,
- Int只能在1-6范围内
- 数值可以减少,但只能在1-6范围内
- 可以是"rolled"(实质上:随机生成一个值)
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:
- 必须在 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
}
}
我想知道如何使 Int
符合 d6
(模具值)。
我想通过协议来做;但我不太确定如何让 Int 遵循 d6 的规则;也就是说,
- Int只能在1-6范围内
- 数值可以减少,但只能在1-6范围内
- 可以是"rolled"(实质上:随机生成一个值)
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:
- 必须在 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
}
}