このライブラリはUIKit macOS(ベータ品質、かなり使用可能)とiOS/TVOS(アルファ品質、レポを参照)のAppKitに安全な錆びたバインディングを提供します。以前にフレームワークのプログラミングを行った場合(SwiftまたはObjective-C)、馴染みがあると感じる方法でそうしようとします。これは、所有権モデルのために錆の場合は難しいですが、いくつかの創造的なコーディングと仮定は私たちをかなり遠くに導くことができます。
これは、プロジェクトがより広い使用状況を確認できるようにするために、crates.ioに存在します。これにより、開発に通知できます。とはいえ、このライブラリは現在初期段階であり、バグがあるかもしれません - それの使用はあなた自身の責任です。ただし、(メモリ/所有権に関して)ルールに従っていれば、一部のアプリではすでに問題ありません。コアリポジトリには、始めるのに役立つ豊富な例があります。
重要
0.2から0.3に移行する場合は、
Cargo.tomlの機能としてappkitまたはuikit選択する必要があります。Toml。この変更は、MacOS/iOS/TVOS(Gnustep、Airyxなど)だけではないプラットフォームをサポートするために行われました。これらの機能の1つは、作業に必要です。appkit、開発の容易さのためにデフォルトです。
このクレートは、Objective-Cランタイムに依存していることに注意してください。ランタイムとのインターフェースには、安全でないブロックが必要です。このクレートはあなたのためにこれらの安全でない相互作用を処理し、安全なラッパーを提供しますが、このクレートを使用することで、
unsafeの使用が特定のものであり、ラップされたコントロールに多少ramp延することを理解します。これは、安全でない使用法を評価、レビュー、または疑問視することができないという意味ではありません。それが起こっていることを知っているだけで、大部分は消えていません。安全でないものの単なる存在に関する問題は、コメントなしで閉鎖されます。
地元のマシンでこのドキュメントを作成したい場合は、機能フラグが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_listAppkitプログラムとUIKITプログラムが通常機能する方法により、 AppDelegateのdid_finish_launching()メソッドから作業の大部分を実行することをお勧めします。これにより、アプリケーションが舞台裏で必要なハウスキーピングを初期化し、実行する時間が保証されます。
主に機能する作品に関しては、以下の表は、さまざまな機能のサポートのレベルを示しています。このリストは、ドキュメントの更新が地獄であるためだけに網羅的ではありません。そのため、詳細については、コード製のドキュメントをチェックすることをお勧めします。
iOSには緑色のチェックマークがありますが、一部のコンポーネントはまだ定義されていません(たとえば、ビュー/ビューコントローラーはまだ非常にアルファです)。
Appkitの形式をシムまたは提供する非アプルプラットフォームは、このライブラリで適切なAppKitサポートを使用できる場合があります。
| 成分 | 説明 | appkit | iOS | TVOS |
|---|---|---|---|---|
| アプリ | 初期化とイベント | ✅ | ✅ | |
| ウィンドウ | 建設、取り扱い、イベント | ✅ | ✅ | |
| ビュー | 建設、スタイリング、イベント | ✅ | ✅ | |
| ViewController | 建設、ライフサイクルイベント | ✅ | ✅ | |
| 色 | システム支援の色、テーマ | ✅ | ✅ | |
| ListView | キャッシュされた行の再利用可能なリスト | ✅ | ||
| ボタン | スタイリング、イベント、ツールバーサポート | ✅ | ||
| ラベル/テキストフィールド | テキストレンダリングと入力 | ✅ | ||
| 画像/ImageView | 読み込み、描画など | ✅ | ✅ | |
| ツールバー | 基本的なネイティブツールバー | ✅ | ||
| SplitViewController | スプリットビュー(ビッグサーフレンドリー) | ✅ | ||
| WebView | wkwebviewのラッパー | ✅ | ||
| userdefaults | 持続的な小さなデータ | ✅ | ✅ | |
| autolayout | さまざまな画面のレイアウトを表示します | ✅ | ✅ |
以下は、有効または無効にできる貨物機能のリストです。
appkit : AppKit.frameworkをリンクします。uikit :links UIKit.framework (ios/tvosのみ)。cloudkit :Links CloudKit.frameworkをリンクし、CloudKit機能に関するいくつかのラッパーを提供します。現在、機能は完了していません。color_fallbacks : systemColorタイプが存在しない古いシステムにフォールバックカラーを提供します。この機能は非常にまれであり、おそらくあなたはそれを必要としないでしょう。quicklook :Links QuickLook.frameworkをリンクし、ファイルのプレビュー画像を生成する方法を提供します。user-notifications : UserNotifications.frameworkをリンクし、macosおよびiOSの通知を放出する機能を提供します。これには、アプリケーションがコード署名される必要があり、それなしでは機能しないことに注意してください。webview :Links WebKit.frameworkをリンクし、 WKWebViewに裏付けられたWebViewコントロールを提供します。プラットフォームにはWebViewコントロールがないため、この機能はTVOSではサポートされていません。また、この機能は、WKWEBVIEWコントロールと非アプルプラットフォームでのさまざまなサポートにより、MACOS/IOSでのみサポートされる可能性があります。webview-downloading-macos :プライベートインターフェイスを介してWebViewからファイルをダウンロードできるようにします。これはアプリストアセーフ機能ではないため、有効にする前にそれに注意してください。この機能は、iOS(ユーザーはダウンロードを非常に異なって処理する)またはTVO(Webブラウザーはまったくありません)でサポートされていません。 既存のココアRSクレートを拡張してみませんか?
良い質問。一日の終わりに、そのクレート(私は信じていて、私が間違っている場合は誰かが私を訂正できると信じています)はサーボに少し結びついており、錆のココアUIモデルを表現するための最良のアプローチを実験したかったのです。このクレートは、 core_foundationとcore_graphicsが内部で使用され、一般的な使用のために再輸出されます。
なぜx言語ではなく錆で書く必要があるのですか?
私の場合、Apple固有の言語で執筆することなく、C/C ++またはJavaScriptで書くことなく、デバイスのネイティブアプリケーション(および製品を構築するのが好きなプラットフォーム)を作成できるようにしたいと思います(注:言語ではなく、ES6/Typecriptではなく、ツールチェーンは問題ありません)。私はこれをやりたいと思っています。なぜなら、私は自分のアプリケーションを他のエコシステムに移植したいときに、山の山にぶつかるのにうんざりしているからです。 Rustは、パフォーマンスを犠牲にすることなく、プラットフォームやエコシステム間でコードを共有するための(成長しているが重要な)実行可能なモデルを提供すると思います。
(これは、インターネットが電子、QTなどのいくつかの組み合わせについて点灯し、暴言する部分です。他の場所でbeatられて死ぬためにここで悩まされていません)
この木枠は、Appleエコシステムをオールインする必要がないが、比較的簡単にそこに作業を移植したい人に役立ちます。誰もが突然錆びて自分のmacos/iOS/TVOSアプリを書き直したいとは思わない。
Objective-Cは死んでいませんか?
はい、そしていいえ。
Appleが間違いなくSwiftを支持し、正当な理由で(そして、私はこれをObjective-Cの恥ずかしい恋人として言っています)。そうは言っても、5年以上のサポートがさらにないと驚くでしょう。 Appleはすぐに非難されますが、Objective-Cランタイムを削除するには、時間と労力が必要です。たぶんスウィフトゥイはそれを殺します、誰が知っています。このようなものの周りのラッパーは、おそらく、時間が来るたびに、基礎となるUIバックエンドを簡単に交換できるようにする必要があります。
注意すべきことの1つは、AppleがSwiftのみのフレームワークのリリースを開始したことです。それらが必要な場合は、リンクとブリッジングの組み合わせを行うことができるはずです。これは、ある時点で基礎となるUIバックエンドの交換がどのように発生するかを知らせるでしょう。
また、Objective-Cを遅いと非難する人もいます。そのために、私は次のことに注意してください:
tl;
uikitを包むだけで、触媒に頼ってみませんか?
Catalystが気分が良くなった単一のアプリケーションはまだ見ていません。しかし、目標は良いことであり、それが今後の道のように見えた場合(たとえば、AppleがAppkitを殺すだけです)、それは確かに選択肢です。
ここですべてのプラットフォーム固有の動作をラップすることはできません...
正しい!各UIコントロールにはobjcフィールドが含まれています。これはエスケープハッチとして使用できます。コントロールが何かをサポートしていない場合、Objective -Cランタイムに自由にドロップして処理できます。
バインディングを使用してこのようなものを自動的に生成してみませんか?
最初の探索のために、私はこれのほとんどを手作業で行いました。結合生成にコミットする前に、錆モデルによく合うアプローチを見つけたかったからです。これは、私が十分に「働いている」ものを手に入れたので、私が次に焦点を合わせる可能性が高いものです。
これは、SwiftプロジェクトであるCacaoに関連していますか?
いいえ。この質問で言及されているプロジェクトは、Linuxで実行するためにCocoaとUikitの一部をマッピングすることを目的としていますが、しばらくの間活動を見ていません(本当にクールでした!)。
2020年のオープンソースプロジェクトの命名は、 .comドメインを購入しようとするようなものです。幸いなことに、複数のプロジェクトが名前を共有できます...それがここで起こることです。
この種の不正行為モデルはありませんか?
あなたがそれをどのように見るかに依存します。私は個人的にはあまり気にしません - これらのプラットフォームのGUIレイヤーは、特定のクラスの製品をサポートするための難しい要件であり、それらを与えることは、アクセシビリティやより深いOS統合などのために戦闘テストされたツールを放棄することを意味します。そうは言っても、内部的には、物事がどのように機能するべきかというRustのモデルを尊重しようとする努力があります。
これはGTK-RSに似ていると考えることができます。より純粋なモデルをサポートまたは試してみたい場合は、Druidなどをチェックしてください。 :)
MIT/MPL-2.0ライセンスに基づいてライセンスされています。詳細については、このリポジトリの適切なファイルを参照してください。 Apple、Appkit、Uikit、Cocoa、およびその他の商標は、Copyright Apple、Inc。
Twitterで私をフォローしたり、ここで問題として当てはまらない質問を私にメールしてください。