Эта библиотека предоставляет безопасные привязки ржавчины для AppKit на macOS (бета -качество, довольно полезное) и UIKit на iOS/TVOS (качество альфа, см. Repo). Он пытается сделать это таким образом, что, если вы делали программирование для рамки ранее (в Swift или Objective-C), будет чувствовать себя знакомым. Это сложно в ржавчине из -за модели владения, но некоторые творческие кодирование и предположения могут сделать нас довольно далеко.
Это существует на crates.io частично, чтобы позволить проекту видеть более широкое использование, что может информировать о разработке. Тем не менее, эта библиотека в настоящее время является ранним этапами и может иметь ошибки - ваше использование ее на вашем собственном риске. Тем не менее, при условии, что вы следуете правилам (в отношении памяти/владения), это уже хорошо для некоторых приложений. Основной репозиторий имеет множество примеров, которые помогут вам начать работу.
Важный
Если вы мигрируете с 0,2 до 0,3, вам следует выбрать либо
appkit, либоuikitв качестве функции в вашемCargo.toml. Это изменение было сделано для поддержки платформ, которые не просто macOS/iOS/TVOS (например, GnuStep, Airyx). Одна из этих функций требуется для работы;appkitне выполняется по умолчанию для простоты разработки.
Обратите внимание, что этот ящик зависит от времени выполнения Objective-C. Взаимодействие со временем выполнения требует небезопасных блоков; Этот ящик обрабатывает эти небезопасные взаимодействия для вас и обеспечивает безопасную обертку, но, используя этот ящик, вы понимаете, что использование
unsafeявляется данным и будет несколько безудержным для обернутых элементов управления. Это не означает, что вы не можете оценить, просматривать или оспаривать небезопасное использование - просто знайте, что это происходит, и в значительной степени это не уходит. Проблемы, относящиеся к простому существованию небезопасного, будут закрыты без комментариев.
Если вы хотите построить документы для этого на своей местной машине, вам понадобится следующее из -за того, как флаги функции работают с cargo doc :
RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --open
use cacao :: appkit :: { App , AppDelegate } ;
use cacao :: appkit :: window :: Window ;
# [ derive ( Default ) ]
struct BasicApp {
window : Window
}
impl AppDelegate for BasicApp {
fn did_finish_launching ( & self ) {
self . window . set_minimum_content_size ( 400. , 400. ) ;
self . window . set_title ( "Hello World!" ) ;
self . window . show ( ) ;
}
}
fn main ( ) {
App :: new ( "com.hello.world" , BasicApp :: default ( ) ) . run ( ) ;
} Для получения более тщательных примеров, проверьте examples/ папку.
Если вы заинтересованы в примере более "кухонной раковины", проверьте TODOS_LIST:
cargo run --example todos_list Благодаря тому, как обычно работают программы Appkit и Uikit, вам рекомендуется выполнять основную часть вашей работы, начиная с метода did_finish_launching() вашего AppDelegate . Это гарантирует, что в заявлении было время инициализировать и сделать любую домашнюю работу, необходимую за кулисами.
С точки зрения в основном рабочие элементы, таблица ниже демонстрирует уровень поддержки различных функций. Этот список не является исчерпывающим только из -за того, что документация обновляет ад ада, поэтому вам рекомендуется проверить документацию, созданную кодом, для получения дополнительной информации:
Обратите внимание, что, хотя у iOS есть зеленые контрольные марки, некоторые компоненты все еще не так хорошо определены (например, виды/ViewControllers по -прежнему очень альфа).
Платформы, не являющиеся APPLE, которые выдерживают или предоставляют форму AppKit, могут использовать хорошую часть поддержки Appkit в этой библиотеке.
| Компонент | Описание | Апкит | ios | TVOS |
|---|---|---|---|---|
| Приложение | Инициализация и события | ✅ | ✅ | |
| Окно | Строительство, обработка, события | ✅ | ✅ | |
| Вид | Строительство, стиль, события | ✅ | ✅ | |
| ViewController | Строительство, Жизненный цикл | ✅ | ✅ | |
| Цвет | Согласованные системы, тематические | ✅ | ✅ | |
| ListView | Список многоразового использования с кэшированными рядами | ✅ | ||
| Кнопка | Стиль, события, поддержка панели инструментов | ✅ | ||
| Ярлык/текстовое поле | Текстовый рендеринг и ввод | ✅ | ||
| Image/ImageView | Загрузка, рисунок и т. Д. | ✅ | ✅ | |
| Панель инструментов | Основная нативная панель инструментов | ✅ | ||
| SplitViewController | Разделенные виды (Большой Сур, дружелюбный) | ✅ | ||
| WebView | Обертка для Wkwebview | ✅ | ||
| Пользователи | Состояние небольших данных | ✅ | ✅ | |
| Autolayout | Просмотр макета для различных экранов | ✅ | ✅ |
Ниже приведен список грузовых функций, которые могут быть включены или отключены.
appkit : ссылки AppKit.framework .uikit : ссылки UIKit.framework (только ios/tvos).cloudkit : ссылки CloudKit.framework и предоставляет некоторые обертки вокруг функциональности CloudKit. В настоящее время не функционирует.color_fallbacks : предоставляет запасные цвета для более старых систем, где systemColor не существует. Эта функция очень необычна, и вам, вероятно, она не нужна.quicklook : ссылки QuickLook.framework и предлагает методы создания предварительных изображений для файлов.user-notifications : ссылки на UserNotifications.framework и предоставляет функциональность для излучения уведомлений на MacOS и iOS. Обратите внимание, что это требует, чтобы ваше приложение было подписано кодом, и не будет работать без него.webview : Links WebKit.framework и предоставляет управление WebView , поддерживаемую WKWebView . Эта функция не поддерживается на TVOS, так как на платформе нет управления веб -просветием. Эта функция также потенциально поддерживается только для MacOS/IOS из-за управления WKWEBVIEW и различной поддержки на платформах, не являющихся APPLE.webview-downloading-macos : включает загрузку файлов из WebView через частный интерфейс. Это не безопасная функция приложений, так что имейте в виду, прежде чем включить. Эта функция не поддерживается на iOS (пользователь будет обрабатывать загрузки совсем по -другому) или TVOS (там вообще нет веб -браузера). Почему бы не расширить существующий ящик какао-RS?
Хороший вопрос. В конце концов, этот ящик (я полагаю, и кто -то может исправить меня, если я ошибаюсь) несколько привязан к сервоприводу, и я хотел поэкспериментировать с тем, каким был лучший подход для представления модели какао -интерфейса в Rust. Этот ящик не полностью игнорирует их работу, либо - core_foundation и core_graphics используются внутренне и реэкспортируются для общего использования.
Почему я должен писать на ржавчине, а не на языке x?
В моем случае я хочу иметь возможность писать нативные приложения для моих устройств (и платформу, для которой я люблю создавать продукты), не будучи заблокированным для написания на яблочных языках ... и без написания в C/C ++ или JavaScript (примечание: набор инструментов , а не на языке - ES6/TypeScript). Я хочу сделать это, потому что я устал от того, чтобы попасть в гору работы, когда хочу перенести свои заявки в другие экосистемы. Я думаю, что Rust предлагает (растущую, но значительную) жизнеспособную модель для совместного использования кода по платформам и экосистемам, не жертвуя производительностью.
(Это та часть, где интернет загорается и разглашается о некоторой комбинации электронов, QT и т. Д. - мы здесь не беспокоим
Этот ящик полезен для людей, которым не нужно идти в экосистеме Apple, но хотят с некоторой легкостью переносить свою работу. Не ожидается, что все вдруг захотят переписать свои приложения MacOS/iOS/TVOS в Rust.
Разве объектив-C мертв?
Да, и нет.
Это правда, что Apple определенно благоприятствует Swift, и не зря (и я говорю это как беззастенчивого любовника Objective-C). С учетом сказанного я был бы удивлен, если бы у нас не было еще одного ~ 5+ лет поддержки; Apple быстро осуществляется, но удаление времени выполнения Objective-C потребует кучу времени и усилий. Может быть, Свифтуи убивает его, кто знает. Обертка вокруг этого материала должна облегчить обмена основного бэкэнда пользовательского интерфейса, когда это приходит.
Следует отметить, что Apple начала выпускать платформы только Swift. Для тех случаев, когда вам это нужно, должно быть возможно сделать некоторую комбинацию связывания и мостики, что сообщает, как заменять базовый бэкэнд пользовательского интерфейса в какой -то момент.
Некоторые также могут осудить Objective-C как медленный. На это я заметил бы следующее:
TL; DR Это, вероятно, хорошо, и у вас есть ржавчина для ваших потребностей в производительности.
Почему бы просто не обернуть uikit, а потом полагаться на катализатор?
Мне еще предстоит увидеть ни одного приложения, где катализатор чувствовал себя хорошо. Однако цель хороша, и если она достигла точки, когда это просто казалось движением вперед (например, Apple просто убивает Appkit), то это, безусловно, вариант.
Вы не можете обернуть все поведение, специфичное для платформы, здесь ...
Правильный! Каждое управление пользовательским интерфейсом содержит поле objc , которое вы можете использовать в качестве люка Escape - если элемент управления что -то не поддерживает, вы можете добраться до времени выполнения Objective -C и обрабатывать его.
Почему бы вам не использовать привязки для автоматического генерации этого материала?
Для первоначальных целей разведки я сделал большую часть этого вручную, так как я хотел найти подход, который хорошо вписывается в модель ржавчины, прежде чем посвятить себя образованию связывания. Это то, на что я, вероятно, сосредоточится на следующем сейчас, когда у меня есть вещи, которые работают, достаточно хорошо.
Это связано с Cacao, Swift Project?
Нет. Проект, упомянутый в этом вопросе, направленный на сопоставление порций какао и uikit для бега на Linux, но в течение некоторого времени не видел активности (это тоже было действительно круто!).
Наименование проекта с открытым исходным кодом в 2020 году похоже на попытку купить домен .com : все хорошее. К счастью, несколько проектов могут поделиться именем ... так что это произойдет здесь.
Разве это не обманывает модель объекта ржавчины?
Зависит от того, как вы на это смотрите. Лично мне все равно - слой графического интерфейса для этих платформ является трудным требованием для поддержки определенных классов продуктов, а также отказаться от их сдачи в бою инструментов для таких вещей, как доступность и более глубокая интеграция ОС. С учетом вышесказанного, внутренне предпринимаются попытки заставить вещи уважать модель Руста того, как все должно работать.
Вы можете думать об этом как о GTK-RS. Если вы хотите поддержать или попробовать более чистую модель, зайдите, посмотрите Druid или что -то в этом роде. :)
Двойная лицензия по лицензии MIT/MPL-2.0. Смотрите соответствующие файлы в этом репозитории для получения дополнительной информации. Apple, Appkit, Uikit, Cocoa и другие товарные знаки - Copyright Apple, Inc.
Вы можете подписаться на меня в Твиттере или написать мне с вопросами, которые не соответствуют проблеме здесь.