Как вы можете реализовать метод NSDocument -canCloseDocumentWithDelegate: shouldCloseSelector: contextInfo: в Swift?

В моем приложенииNSDocument критически важное оборудование подкласса - пользователи действительно не хотят закрывать документ случайно! Итак, я реализовалcanCloseDocumentWithDelegate… показатьNSAlert и спросите перед закрытием.

Я сейчас пытаюсь реализовать эту же вещь в приложении, написанном на Swift.

Поскольку ответ приходит асинхронно, результат «должен закрыться» передается обратному вызову делегата, а не просто возвращается. В документации для-canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:, это говорит:

Метод обратного вызова shouldCloseSelector должен иметь следующую подпись:

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

Итак, поскольку есть 3 аргумента разных типов, я не могу использовать простоеperformSelector:withObject: методы стиля - вы должны использовать NSInvocation. Обратите внимание, что делегат имеет типidи подпись выше не появляется ни в одном формальном протоколе - вы не можете просто вызвать метод в обычном режиме. (Видеть этосписок рассылки например как это надо сделать)

Теперь проблема в том, что NSInvocation не разрешен в Swift! Смотрите блог Swift«Что случилось с NSMethodSignature»:

Внедрение инфраструктуры Какао в Swift дало нам уникальную возможность взглянуть на наши API с новой точки зрения. Мы нашли классы, которые нам не подходили для целей Swift, чаще всего из-за приоритета безопасности. Например, некоторые классы, связанные с динамическим вызовом метода, не представлены в Swift, а именноNSInvocation а такжеNSMethodSignature.

Это звучит как хорошая вещь, но падает, когда простойNSDocument API требует NSInvocation еще! Реальное решение всей этой проблемы было бы для Apple, чтобы представить новыйcanCloseDocument… API, использующий блок обратного вызова. Но пока это не произойдет, каково лучшее решение?

Ответы на вопрос(4)

Ваш ответ на вопрос