Использование Swift с плагином панели предпочтений OS X

Я бы хотел использовать Swift для создания плагина панели предпочтений OS X для приложения "Системные настройки", но я не могу заставить его работать.

введите описание изображения здесь

После нажатия "Далее" шаблон Xcode не предлагает выбор Swift как языка, но автоматически создает проект в Objective-C.

введите описание изображения здесь

Без добавления какого-либо кода или что-либо еще, проект будет успешно выполнен. Если вы щелкните правой кнопкой мыши на Продукте и выберите "Открыть во внешнем редакторе", системные настройки успешно установят и загрузят панель предпочтений.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Он просто работает!

Хорошо, что здорово, но теперь я хочу добавить новый подкласс Cocoa с помощью Swift.

введите описание изображения здесь

введите описание изображения здесь

Принятие значения по умолчанию и возможность создания заголовка моста.

введите описание изображения здесь

Теперь, закройте Системные настройки и без добавления кода, перестройте проект. Как и прежде, щелкните правой кнопкой мыши Продукт и "Открыть во внешнем редакторе".

Системные настройки подтвердят замену панели предпочтений, и она ее установит, но затем она не загружается.

введите описание изображения здесь

введите описание изображения здесь

Если вы показываете встроенный продукт в Finder, в дополнение к плагину .prefPane, также есть папка .swiftmodule.

введите описание изображения здесь

Я предполагаю, что в фазах сборки или настройках сборки что-то не хватает, которые отвечают за включение модуля .swift с остальной частью пакета, но не смогли понять это.

После добавления кода, который использует новый класс, необходимо импортировать заголовок зонтика Swift ( "Prax-Swift.h" ), чтобы скомпилировать проект, но импорт заголовка зонтика не устраняет эту проблему.

//  Prax.h

#import <PreferencePanes/PreferencePanes.h>
#import "Prax-Swift.h"

@interface Prax : NSPreferencePane

@property PraxObject *ourPrax;

- (void)mainViewDidLoad;

@end

Я также попытался удалить Prax.h и Prax.m и просто реализовать подкласс NSPreferencePane в Swift. Как и раньше, проект строит и устанавливает, но системные настройки не загружают его.

//  Prax.swift

import PreferencePanes

class Prax: NSPreferencePane {

    override func mainViewDidLoad() {

    }
}

Извините, если я использовал слишком много изображений в этом вопросе; это казалось самым ясным способом объяснить проблему и облегчить ее воспроизведение. Вероятно, это простое решение. Любые идеи?

Ответ 1

Во-первых, вам нужно включить параметр "Встроенный контент Contains Swift", чтобы Xcode скопировал необходимые библиотеки Swift в пакет.

Затем вы получите эту ошибку:

System Preferences[68872]: dlopen_preflight failed with
  dlopen_preflight(/.../preftest.prefPane/Contents/MacOS/preftest):

  Library not loaded: @rpath/libswiftAppKit.dylib
    Referenced from: /.../preftest.prefPane/Contents/MacOS/preftest  
    Reason: image not found for /.../preftest.prefPane

Это означает, что приложение не знает, куда загрузить загруженные библиотеки Swift.

Чтобы исправить это, добавьте @loader_path/../Frameworks к путям поиска путей выполнения в настройках сборки, сообщив, что библиотеки Swift находятся в каталоге Frameworks вашего префикса:

Подробнее о динамической загрузке см. dyld man page.