在swift中使用NSPredicate,但无法得到与Objective-C编写的代码相同的结果

问题描述 投票:0回答:1

我用swift写了一段代码,但无法得到预期的结果。 如果您知道代码中的错误,请帮助我,非常感谢您。 这是我写的代码:

let assertingFactKey = "hunt" as NSString
//
let ruleSystem = GKRuleSystem()
let playerFar : NSPredicate = NSPredicate(format:"$distanceToPlayer.floatValue >= 10.0")
ruleSystem.add(GKRule(predicate: playerFar, assertingFact: assertingFactKey, grade: 1.0))
let playerNear = NSPredicate(format:"$distanceToPlayer.floatValue < 10.0")
ruleSystem.add(GKRule(predicate: playerNear, assertingFact: assertingFactKey, grade: 1.0))
        //
        for i in 1...30 {
            ruleSystem.state["distanceToPlayer"] = i
            ruleSystem.reset()
            ruleSystem.evaluate()
            let result = ruleSystem.grade(forFact:assertingFactKey) > 0.0
            if result {
                print ("**True : \(i)")
            } else {
                print ("**False")
            }
        }

结果始终为 True。

我想知道在 swift 中使用 GKRuleSystem 的正确方法

使用 Objective-C 的代码:

   GKRuleSystem *ruleSystem = [[GKRuleSystem alloc] init];
   NSPredicate *playerFar = [NSPredicate predicateWithFormat:@"$distanceToPlayer.floatValue >= 10.0"];
   [ruleSystem addRule:[GKRule ruleWithPredicate:playerFar assertingFact:@"hunt" grade:1.0]];
   NSPredicate *playerNear = [NSPredicate predicateWithFormat:@"$distanceToPlayer.floatValue < 10.0"];
   [ruleSystem addRule:[GKRule ruleWithPredicate:playerNear retractingFact:@"hunt" grade:1.0]];
    
    for (NSUInteger i = 0; i<=30; i++) {
        ruleSystem.state[@"distanceToPlayer"] = @(i);
        [ruleSystem reset];
        [ruleSystem evaluate];
        BOOL result = ([ruleSystem gradeForFact:@"hunt"] > 0.0);
        if (result) {
            NSLog(@"true: %ld", i);
        } else {
            NSLog(@"false");
        }
    }
swift objective-c nspredicate gameplay-kit
1个回答
0
投票

我想这里可能有错字。在 Objective-C 中是

retractingFact
,在 Swift 中是
assertingFact

//Objc-C
[ruleSystem addRule:[GKRule ruleWithPredicate:playerNear retractingFact:@"hunt" grade:1.0]];

///Swift
ruleSystem.add(GKRule(predicate: playerNear, assertingFact: assertingFactKey, grade: 1.0))
© www.soinside.com 2019 - 2024. All rights reserved.