您如何确定GKRuleSystem中GKRules的评估顺序?

时间:2016-03-05 20:29:45

标签: ios gameplay-kit

我正在探索Apple的GameplayKit API,目前我对GKRuleSystem评估其规则的方式感到困惑。文档说明显着属性决定评估的顺序,首先评估更高显着性规则(https://developer.apple.com/library/ios/documentation/GameplayKit/Reference/GKRule_Class/index.html#//apple_ref/occ/instp/GKRule/salience)。但实际上,这似乎并未发生:

let twoRuleSystem = GKRuleSystem()
let stateConditionA = "A"
let stateConditionB = "B"
let fact = "A"

let stronglyAssert = NSPredicate(format: "state.\(stateConditionA) = true")
let weaklyRetract = NSPredicate(format: "state.\(stateConditionB) = true")
let strongRule = GKRule(predicate: stronglyAssert, assertingFact: fact, grade: 1.0)
let weakRule = GKRule(predicate: weaklyRetract, retractingFact: fact, grade: 0.25)

strongRule.salience = 10
weakRule.salience = 1

twoRuleSystem.addRulesFromArray([strongRule, weakRule])

twoRuleSystem.state[stateConditionA] = true
twoRuleSystem.state[stateConditionB] = true
twoRuleSystem.reset()
twoRuleSystem.evaluate()

print("The fact \(fact) evaluates to \(twoRuleSystem.gradeForFact(fact))")
// prints "The fact A evaluates to 1.0"

如果我颠倒了这两个事实的突出性,那么结果是“事实A评估为0.75”。

我希望当我的strongRule具有10的显着性时,它将首先被评估,并且事实A将被声明为值为1.0。然后将评估weakRule,并且事实A将以0.25的值收回,导致事实等级为0.75。但这只有在弱规则具有更高显着性的情况下才有效。

这让我更加困惑,因为如果首先评估weakRule,我会期望事实A的值为0;事实的等级只能是0到1.0之间的值。然后我希望对strongRule进行评估并断言事实A的等级为1.0。但这不是正在发生的事情。

1 个答案:

答案 0 :(得分:1)

我得到了Apple的回复 - 这是一个确认的错误。 GKRuleSystem不会按照添加的顺序评估其规则。您必须使用突出值来保证规则执行的顺序。

此外,较低的数字意味着较高的显着性:显着性为1的规则将在显着性为2的规则之前得到评估。