이 라이브러리는 MACOS (베타 품질, 상당히 사용할 수있는) 및 iOS/TVOS (Alpha 품질, Repo 참조)의 AppKit UIKit 대한 안전한 녹 바인딩을 제공합니다. 이전 (Swift 또는 Objective-C에서) 이전에 프레임 워크를위한 프로그래밍을 수행 한 방식으로 그렇게하려고합니다. 이것은 소유권 모델로 인해 녹에서 까다 롭지 만 창의적인 코딩과 가정은 우리를 꽤 멀리 할 수 있습니다.
이것은 프로젝트가 더 넓은 사용을 볼 수 있도록 Crates.io에 존재합니다. 이는 개발에 정보를 제공 할 수 있습니다. 즉,이 라이브러리는 현재 초기 단계이며 버그가있을 수 있습니다. 귀하의 사용은 자신의 위험에 처해 있습니다. 그러나 규칙을 따르면 (메모리/소유권과 관련하여) 일부 앱에서는 이미 괜찮습니다. 핵심 저장소에는 시작하는 데 도움이되는 풍부한 예제가 있습니다.
중요한
0.2에서 0.3으로 마이그레이션하는 경우
Cargo.toml의 기능으로appkit또는uikit선택해야합니다. 이 변경은 MacOS/iOS/TVOS (예 : Gnustep, Airyx)가 아닌 플랫폼을 지원하기 위해 이루어졌습니다. 이러한 기능 중 하나는 작동해야합니다.appkit개발의 용이성을 위해 기본적으로 기본적으로 제공됩니다.
이 상자는 목표 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 프로그램이 일반적으로 작동하는 방식으로 인해 AppDelegate 의 did_finish_launching() 메소드에서 시작하여 대부분의 작업을 수행하는 것이 좋습니다. 이를 통해 응용 프로그램은 무대 뒤에서 필요한 하우스 키핑을 초기화하고 수행 할 시간이 보장됩니다.
대부분의 작업 조각 측면에서 아래 표는 다양한 기능에 대한 지원 수준을 보여줍니다. 이 목록은 문서화가 지옥을 업데이트 한 덕분에 철저하지 않습니다. 따라서 자세한 정보는 코드 제작 된 문서를 확인하는 것이 좋습니다.
iOS에는 녹색 확인 마크가 있지만 일부 구성 요소는 여전히 잘 정의되지 않았습니다 (예 :보기/뷰 구성자는 여전히 알파입니다).
AppKit의 형태를 제공하거나 제공하는 비 앱 플랫폼은이 라이브러리에서 AppKit 지원의 좋은 덩어리를 사용할 수 있습니다.
| 요소 | 설명 | Appkit | iOS | TVOS |
|---|---|---|---|---|
| 앱 | 초기화 및 이벤트 | ✅ | ✅ | |
| 창문 | 건축, 취급, 이벤트 | ✅ | ✅ | |
| 보다 | 건축, 스타일링, 이벤트 | ✅ | ✅ | |
| ViewController | 시공, 수명주기 이벤트 | ✅ | ✅ | |
| 색상 | 시스템 지원 색상, 테마 | ✅ | ✅ | |
| ListView | 캐시 된 행으로 재사용 가능한 목록 | ✅ | ||
| 단추 | 스타일링, 이벤트, 도구 모음 지원 | ✅ | ||
| 레이블/텍스트 필드 | 텍스트 렌더링 및 입력 | ✅ | ||
| Image/ImageView | 로딩, 드로잉 등 | ✅ | ✅ | |
| 도구 모음 | 기본 기본 도구 모음 | ✅ | ||
| SplitViewController | 분할보기 (Big Sur 친화적) | ✅ | ||
| 웹 뷰 | wkwebview 용 래퍼 | ✅ | ||
| userDefaults | 작은 데이터를 지속합니다 | ✅ | ✅ | |
| autolayout | 다양한 화면에 대한 레이아웃을 봅니다 | ✅ | ✅ |
다음은 활성화 또는 비활성화 할 수있는화물 기능 목록입니다.
appkit : Links AppKit.framework .uikit : 링크 UIKit.framework (iOS/TVOS 만 해당).cloudkit : CloudKit.framework 연결하고 CloudKit 기능에 대한 일부 포장지를 제공합니다. 현재 기능이 완료되지 않습니다.color_fallbacks : systemColor 유형이 존재하지 않는 이전 시스템에 폴백 색상을 제공합니다. 이 기능은 매우 드문 일이며 아마도 필요하지 않을 것입니다.quicklook : 링크 QuickLook.framework 및 파일의 미리보기 이미지를 생성하는 방법을 제공합니다.user-notifications : 링크 UserNotifications.framework 및 macOS 및 iOS에서 알림을 방출하기위한 기능을 제공합니다. 이를 위해서는 응용 프로그램이 코드 서명 해야하며 IT 없이는 작동하지 않습니다.webview : WebKit.framework 연결하고 WKWebView 가 뒷받침하는 WebView 컨트롤을 제공합니다. 플랫폼에는 WebView 컨트롤이 없으므로이 기능은 TVOS에서 지원되지 않습니다. 이 기능은 또한 WKWebView 제어 및 비 Apple 플랫폼에 대한 다양한 지원으로 인해 MacOS/iOS에 대해서만 지원됩니다.webview-downloading-macos : 개인 인터페이스를 통해 WebView 에서 파일을 다운로드 할 수 있습니다. 이것은 앱 스토어-안전 기능이 아니므로 활성화하기 전에이를 알고 있어야합니다. 이 기능은 iOS (사용자가 다운로드를 매우 다르게 처리 함) 또는 TVOS (웹 브라우저가 전혀 없음)에서 지원되지 않습니다. 기존 Cocoa-Rs 상자를 확장하지 않겠습니까?
좋은 질문입니다. 하루가 끝날 무렵, 그 상자 (나는 믿고, 누군가가 내가 틀렸을 때 나를 교정 할 수 있음)는 서보와 다소 묶여 있으며, Rust에서 Cocoa UI 모델을 표현하기위한 최선의 접근법을 실험하고 싶었습니다. 이 상자는 그들의 작업을 완전히 무시하지 않습니다. core_foundation 및 core_graphics 내부적으로 사용되며 일반적인 용도로 다시 수출됩니다.
X 언어보다는 녹으로 써야하는 이유는 무엇입니까?
제 경우에는 Apple 특정 언어로 작성되지 않고 내 장치에 대한 기본 응용 프로그램 (및 제품을 제작하고 싶은 플랫폼)에 대한 기본 응용 프로그램을 작성하고 C/C ++ 또는 JavaScript로 글을 쓰지 않고 (참고 : 언어가 아닌 도구 체인 -ES6/Spectioncript는 괜찮습니다). 응용 프로그램을 다른 생태계에 포팅하고 싶을 때 일의 산을 치는 데 지쳤 기 때문에 이렇게하고 싶습니다. Rust는 성능을 희생하지 않고 플랫폼 및 생태계에서 코드를 공유하기위한 (성장하지만 중요한) 실행 가능한 모델을 제공한다고 생각합니다.
(이것은 인터넷이 밝아지고 전자, QT 등의 일부 조합에 대해 울부 짖는 부분입니다. 우리는 다른 곳에서 사망하기 때문에 여기서 귀찮게하지 않습니다)
이 상자는 Apple 생태계에 올인 할 필요가 없지만 상대적으로 쉽게 일을 할 필요가없는 사람들에게 유용합니다. 모든 사람이 갑자기 Rust에서 MacOS/iOS/TVOS 앱을 다시 작성하기를 원할 것으로 기대하지는 않습니다.
객관적인 C가 죽지 않았습니까?
예, 아니요.
애플이 신속하게 신속하고 정당한 이유를 선호한다는 것은 사실이다 (그리고 나는 이것을 객관적인 C를 자극하지 않은 연인이라고 말한다). 그 말에 따르면, 우리가 또 다른 ~ 5 년 이상의 지원이 없다면 놀랄 것입니다. Apple은 빠르게 사용되지 않지만 Objective-C 런타임을 제거하려면 많은 시간과 노력이 필요합니다. 아마도 Swiftui가 그것을 죽일 수도 있습니다. 이 물건 주위의 포장지는 시간이 올 때마다 기본 UI 백엔드를 더 쉽게 교체 할 수있게해야합니다.
한 가지 주목할 점은 애플이 신속한 전용 프레임 워크를 출시하기 시작 했다는 것입니다. 필요한 경우 링크와 브리징의 조합을 수행 할 수 있어야합니다. 이는 기본 UI 백엔드를 어느 시점에서 어떻게 교환하는지 알려줍니다.
일부는 또한 대상 C를 느리게 결정할 수도 있습니다. 그것에 대해서는 다음과 같습니다.
TL; DR은 괜찮을 것입니다. 성능 요구에 대한 녹이 있습니다.
왜 uikit을 감싸고 촉매에 의존하지 않습니까?
나는 Catalyst가 기분이 좋았던 단일 응용 프로그램을 아직 보지 못했습니다. 그러나 목표는 좋으며, 그것이 앞으로 나아가는 것처럼 보였던 시점에 도달했다면 (예 : Apple은 Appkit을 죽인다) 확실히 옵션입니다.
여기에 모든 플랫폼 별 동작을 랩핑 할 수는 없습니다 ...
옳은! 각 UI 컨트롤에는 Escape Hatch로 사용할 수있는 objc 필드가 포함되어 있습니다. 컨트롤이 무언가를 지원하지 않으면 대 Objective -C 런타임에 직접 떨어 뜨려 처리 할 수 있습니다.
바인딩을 사용 하여이 물건을 자동으로 생성하지 않는 이유는 무엇입니까?
초기 탐사 목적으로 바인딩 생성에 커밋하기 전에 Rust 모델에 적합한 접근 방식을 찾고 싶었 기 때문에이 작업의 대부분을 손으로 수행했습니다. 이것은 내가 "일하는"일이 충분하기 때문에 다음에 초점을 맞출 것입니다.
이것은 Swift 프로젝트 인 Cacao와 관련이 있습니까?
아니요.이 질문에서 언급 된이 프로젝트는 코코아와 Uikit의 일부를 Linux에서 실행하기 위해 매핑하는 것을 목표로했지만 한동안 활동을 보지 못했습니다 (정말 멋졌다).
2020 년 오픈 소스 프로젝트 이름 지정은 .com 도메인을 구매하려는 것과 같습니다. 운 좋게도 여러 프로젝트가 이름을 공유 할 수 있습니다. 그래서 여기서 일어날 일입니다.
이런 종류의 Rust Object 모델을 속이지 않습니까?
당신이 그것을 보는 방법에 따라 다릅니다. 저는 개인적으로 너무 신경 쓰지 않습니다.이 플랫폼의 GUI 계층은 특정 클래스의 제품을 지원하기위한 어려운 요구 사항이며,이를 포기한다는 것은 액세스 가능성 및 더 깊은 OS 통합과 같은 것들을위한 전투 테스트 도구를 포기하는 것을 의미합니다. 그렇게 말하면 내부적으로 사물이 어떻게 작동 해야하는지에 대한 Rust의 모델을 존중하려고 노력하는 노력이 있습니다.
이것을 GTK-R과 유사하다고 생각할 수 있습니다. 더 순수한 모델을 지원하거나 시도하려면 Druid 등을 확인하십시오. :)
MIT/MPL-2.0 라이센스에 따라 이중 라이센스. 자세한 내용은이 저장소의 적절한 파일을 참조하십시오. Apple, Appkit, Uikit, Cocoa 및 기타 상표는 Copyright Apple, Inc입니다.
트위터에서 나를 따라 오거나 여기에 문제가되지 않는 질문을 이메일로 보내주십시오.