GKState: почему self.StateMachine == nil?

#swift #gameplay-kit

#swift #игровой процесс-комплект

Вопрос:

У меня есть следующий код на моей игровой площадке:

 import GameplayKit
class TestClass {
    var sm: GKStateMachine

    init() {
        sm = GKStateMachine(states: [MyState()])
        sm.enter(MyState.self)
    }
}

class MyState: GKState {

    override init() {
        super.init()
    }
    override func didEnter(from previousState: GKState?) {
        printStateM()
    }
    func printStateM() {
        if (self.stateMachine == nil) {
            print("StateMachine")
        } else {
            print("No StateMachine")
        }
    }
}

var t = TestClass()
 

Вывод «Нет StateMachine».
Интересно, почему свойство StateMachine для MyState равно нулю?

Комментарии:

1. Разве это не должно быть self.stateMachine != nil ? (или, если вы планируете работать с переменной, вы, вероятно if let stateMachine = self.stateMachine , хотите или что-то в этом роде)

Ответ №1:

Потому что вы допустили опечатку:

 import GameplayKit
class TestClass {
    var sm: GKStateMachine

    init() {
        sm = GKStateMachine(states: [MyState()])
        sm.enter(MyState.self)
    }
}

class MyState: GKState {

    override init() {
        super.init()
    }
    override func didEnter(from previousState: GKState?) {
        printStateM()
    }
    func printStateM() {
        if (self.stateMachine != nil) { // ⚠️
            print("StateMachine")
        } else {
            print("No StateMachine")
        }
    }
}

var t = TestClass()
 

а еще лучше, вы действительно можете распечатать его:

 import GameplayKit
class TestClass {
    var sm: GKStateMachine

    init() {
        sm = GKStateMachine(states: [MyState()])
        sm.enter(MyState.self)
    }
}

class MyState: GKState {

    override init() {
        super.init()
    }

    override func didEnter(from previousState: GKState?) {
        printStateM()
    }

    func printStateM() {
        if let stateMachine = self.stateMachine {
            print("StateMachine: (stateMachine)")
        } else {
            print("No StateMachine")
        }
    }
}

var t = TestClass()
 

Комментарии:

1. У меня сложилось впечатление, что вопросы об опечатках должны быть закрыты.

2. Да, и я подал свой голос за закрытие. К сожалению, я не могу сделать это в одиночку, для этого нужно еще 4 голоса.