Usando NSUndoManager, cómo registrar deshacer usando cierres Swift

Estoy tratando de asimilar cómo usarNSLayoutManager utilizando cierres rápidos. Puedo registrar con éxito unundo como sigue:

doThing();
undoManager?.registerUndoWithTarget(self, handler: { _ in
    undoThing();
}
undoManager?.setActionName("do thing")

Por supuesto que necesito apoyarredo lo que equivale a deshacer un deshacer. Yo puedo hacer eso:

doThing();
undoManager?.registerUndoWithTarget(self, handler: { _ in
    undoThing();

    undoManager?.registerUndoWithTarget(self, handler: { _ in
        doThing();
    }
    undoManager?.setActionName("do thing")
}
undoManager?.setActionName("do thing")

Pero ahora necesito soportar deshacer el rehacer ... hmmm ... ok:

doThing();
undoManager?.registerUndoWithTarget(self, handler: { _ in
    undoThing();

    undoManager?.registerUndoWithTarget(self, handler: { _ in
        doThing();

        undoManager?.registerUndoWithTarget(self, handler: { _ in
             undoThing();
        }
        undoManager?.setActionName("do thing")
    }
    undoManager?.setActionName("do thing")
}
undoManager?.setActionName("do thing")

Como puede ver, sus "tortugas hasta el fondo". ¿Cómo escapo de esta locura? es decir, en todo el código de ejemplo que puedo encontrar, la gente usa la versión del selector del código para registrar un método que se puede deshacer; esto obviamente no es factible con el método de cierre que estoy usando ... ¿Cómo se usa el cierre? versión y obtener deshacer / rehacer ilimitado?

Respuestas a la pregunta(1)

Su respuesta a la pregunta