¿Cómo puede implementar el método NSDocument -canCloseDocumentWithDelegate: shouldCloseSelector: contextInfo: en Swift?

En mi solicitud, unNSDocument hardware de misión crítica de subclase: ¡los usuarios realmente no quieren cerrar un documento por accidente! Entonces, he implementadocanCloseDocumentWithDelegate… para mostrar unNSAlert y preguntar antes de cerrar.

Ahora estoy tratando de implementar lo mismo en una aplicación escrita en Swift.

Dado que la respuesta llega de forma asíncrona, el resultado "debería cerrarse" se pasa a una devolución de llamada en un delegado, y no simplemente se devuelve. En la documentación para-canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:, dice:

El método de devolución de llamada shouldCloseSelector debe tener la siguiente firma:

- (void)document:(NSDocument *)doc shouldClose:(BOOL)shouldClose contextInfo:(void *)contextInfo

Entonces, como hay 3 argumentos de diferentes tipos, no puedo usar el simpleperformSelector:withObject: métodos de estilo: debe usar NSInvocation. Tenga en cuenta que el delegado es de tipoid, y la firma anterior no aparece en ningún protocolo formal; no puede llamar al método normalmente. (Mira estopublicación de la lista de correo por ejemplo de cómo se debe hacer esto)

Ahora, el problema es que NSInvocation no está permitido en Swift. Ver el blog de Swift"Lo que sucedió con NSMethodSignature":

Llevar los marcos de Cocoa a Swift nos dio una oportunidad única de ver nuestras API con una nueva perspectiva. Encontramos clases que no nos sentíamos en forma con los objetivos de Swift, la mayoría de las veces debido a la prioridad que le damos a la seguridad. Por ejemplo, algunas clases relacionadas con la invocación de métodos dinámicos no están expuestas en Swift, a saberNSInvocation yNSMethodSignature.

Eso suena como algo bueno, pero se cae cuando un simpleNSDocument API requiere NSInvocation todavía! La solución real a todo este problema sería que Apple presentara un nuevocanCloseDocument… API utilizando una devolución de llamada de bloque. Pero hasta que eso suceda, ¿cuál es la mejor solución?

Respuestas a la pregunta(4)

Su respuesta a la pregunta