ห้องสมุดนี้ให้การผูกสนิมที่ปลอดภัยสำหรับ 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 มีเครื่องหมายถูกสีเขียวส่วนประกอบบางส่วนยังไม่ได้กำหนดไว้อย่างดี (เช่น Views/ViewControllers ยังคงเป็นอัลฟ่าที่นั่น)
แพลตฟอร์มที่ไม่ใช่แอปเปิ้ลที่ Shim หรือให้รูปแบบของ AppKit อาจสามารถใช้การสนับสนุน AppKit ที่ดีในห้องสมุดนี้
| ส่วนประกอบ | คำอธิบาย | appkit | iOS | tvos |
|---|---|---|---|---|
| แอป | การเริ่มต้นและเหตุการณ์ | |||
| หน้าต่าง | การก่อสร้างการจัดการกิจกรรม | |||
| ดู | การก่อสร้างสไตล์การจัดงาน | |||
| ViewController | การก่อสร้างกิจกรรมวงจรชีวิต | |||
| สี | สีที่ได้รับการหนุน | |||
| ListView | รายการที่นำกลับมาใช้ใหม่พร้อมแถวแคช | |||
| ปุ่ม | จัดแต่งทรงผม, กิจกรรม, รองรับแถบเครื่องมือ | |||
| ฉลาก/ฟิลด์ข้อความ | การเรนเดอร์ข้อความและอินพุต | |||
| Image/ImageView | การโหลดการวาด ฯลฯ | |||
| แถบเครื่องมือ | แถบเครื่องมือพื้นฐานพื้นฐาน | |||
| SplitViewController | วิวแยก (Big Sur Friendly) | |||
| เว็บวิว | wrapper สำหรับ wkwebview | |||
| userdefaults | ข้อมูลขนาดเล็กที่ยังคงอยู่ | |||
| autolayout | ดูเค้าโครงสำหรับหน้าจอที่แตกต่างกัน |
ต่อไปนี้เป็นรายการคุณสมบัติการขนส่งสินค้าที่สามารถเปิดใช้งานหรือปิดใช้งานได้
appkit : Links AppKit.frameworkuikit : ลิงก์ UIKit.framework (iOS/TVOS เท่านั้น)cloudkit : Links CloudKit.framework และให้ wrappers เกี่ยวกับฟังก์ชั่น CloudKit ขณะนี้ยังไม่สมบูรณ์color_fallbacks : ให้สีทางเลือกสำหรับระบบเก่าที่ไม่มีประเภท systemColor คุณสมบัตินี้เป็นเรื่องแปลกมากและคุณอาจไม่ต้องการมันquicklook : ลิงก์ QuickLook.framework และเสนอวิธีการสร้างภาพตัวอย่างสำหรับไฟล์user-notifications : ลิงก์ UserNotifications.framework และให้ฟังก์ชั่นสำหรับการเปล่งการแจ้งเตือนบน macOS และ iOS โปรดทราบว่าสิ่งนี้ ต้องการ แอปพลิเคชันของคุณที่เซ็นชื่อและจะไม่ทำงานหากไม่มีมันwebview : Links WebKit.framework และให้การควบคุม WebView ที่ได้รับการสนับสนุนโดย WKWebView คุณสมบัตินี้ไม่ได้รับการสนับสนุนบน TVOS เนื่องจากแพลตฟอร์มไม่มีการควบคุม WebView คุณลักษณะนี้อาจได้รับการสนับสนุนเฉพาะสำหรับ MacOS/iOS เนื่องจากการควบคุม WKWebView และการสนับสนุนที่แตกต่างกันบนแพลตฟอร์มที่ไม่ใช่แอปเปิ้ลwebview-downloading-macos : เปิดใช้งานการดาวน์โหลดไฟล์จาก WebView ผ่านอินเทอร์เฟซส่วนตัว นี่ไม่ใช่คุณลักษณะที่ปลอดภัยจากร้านค้าดังนั้นโปรดทราบก่อนที่จะเปิดใช้งาน คุณสมบัตินี้ไม่รองรับบน iOS (ผู้ใช้จะจัดการการดาวน์โหลดที่แตกต่างกันมาก) หรือ TVOS (ไม่มีเว็บเบราว์เซอร์เลย) ทำไมไม่ขยายลังโกโก้-RS ที่มีอยู่?
คำถามที่ดี ในตอนท้ายของวันลังนั้น (ฉันเชื่อว่าและบางคนสามารถแก้ไขฉันได้ถ้าฉันผิด) ค่อนข้างเชื่อมโยงกับเซอร์โวและฉันต้องการทดลองกับวิธีที่ดีที่สุดสำหรับการเป็นตัวแทนของโมเดลโกโก้ UI ในสนิมคือ ลังนี้ไม่ได้เพิกเฉยต่องานของพวกเขาอย่างสิ้นเชิงเช่น - core_foundation และ core_graphics ถูกนำมาใช้ภายในและส่งออกอีกครั้งเพื่อการใช้งานทั่วไป
ทำไมฉันถึงเขียนเป็นสนิมแทนที่จะเป็นภาษา X?
ในกรณี ของฉัน ฉันต้องการที่จะเขียนแอปพลิเคชันดั้งเดิมสำหรับอุปกรณ์ของฉัน (และแพลตฟอร์มที่ฉันต้องการสร้างผลิตภัณฑ์สำหรับ) โดยไม่ต้องถูกล็อคในการเขียนในภาษาเฉพาะแอปเปิ้ล ... และไม่มีการเขียนใน C/C ++ หรือ JavaScript (หมายเหตุ: Toolchain ไม่ใช่ภาษา - ES6/TypeScript ฉันต้องการทำสิ่งนี้เพราะฉันเบื่อที่จะตีภูเขาแห่งการทำงานเมื่อฉันต้องการพอร์ตแอปพลิเคชันของฉันไปยังระบบนิเวศอื่น ๆ ฉันคิดว่า Rust นำเสนอรูปแบบที่มีความสำคัญ (ที่กำลังเติบโต แต่สำคัญ) สำหรับการแบ่งปันรหัสผ่านแพลตฟอร์มและระบบนิเวศโดยไม่ต้องเสียสละประสิทธิภาพ
(นี่คือส่วนที่อินเทอร์เน็ตสว่างขึ้นและพูดจาโผงผางเกี่ยวกับการรวมกันของอิเล็กตรอน, QT และอื่น ๆ - เราไม่ได้รบกวนที่นี่เพราะมันถูกทุบตีไปที่อื่น)
ลังนี้มีประโยชน์สำหรับผู้ที่ไม่จำเป็นต้องไปทั้งหมดในระบบนิเวศของ Apple แต่ต้องการพอร์ตงานของพวกเขาที่นั่นอย่างง่ายดาย ไม่คาดว่าทุกคนจะต้องการเขียนแอพ MacOS/iOS/TVOS ของพวกเขาใน Rust
Objective-C ตายหรือไม่?
ใช่และไม่ใช่
เป็นความจริงที่ว่า Apple ให้ความช่วยเหลืออย่างรวดเร็วและด้วยเหตุผลที่ดี (และฉันก็พูดว่านี่เป็นคนรักที่ไม่สะทกสะท้านของ Objective-C) ด้วยที่กล่าวว่าฉันจะประหลาดใจถ้าเราไม่ได้รับการสนับสนุนอีก ~ 5 ปี แอปเปิ้ลมีความรวดเร็วในการเลิกใช้ แต่การลบรันไทม์ Objective-C จะต้องใช้เวลาและความพยายามมากมาย บางที Swiftui ฆ่ามันใครจะรู้ เสื้อคลุมรอบ ๆ สิ่งนี้น่าจะทำให้ง่ายต่อการสลับแบ็กเอนด์ UI พื้นฐานเมื่อใดก็ตามที่ถึงเวลา
สิ่งหนึ่งที่ควรทราบคือ Apple เริ่ม เปิดตัวเฟรมเวิร์กอย่างรวดเร็วเท่านั้น สำหรับกรณีที่คุณต้องการสิ่งเหล่านั้นควรเป็นไปได้ที่จะทำการผสมผสานระหว่างการเชื่อมโยงและเชื่อมโยง - ซึ่งจะแจ้งให้ทราบว่าการแลกเปลี่ยนแบ็กเอนด์ UI พื้นฐานจะเกิดขึ้นได้อย่างไรในบางจุด
บางคนอาจประณาม Objective-C ช้า เพื่อที่ฉันจะทราบสิ่งต่อไปนี้:
tl; dr มันอาจจะดีและคุณมีสนิมสำหรับความต้องการการแสดงของคุณ
ทำไมไม่ห่อ Uikit แล้วพึ่งพาตัวเร่งปฏิกิริยา?
ฉันยังไม่เห็นแอปพลิเคชันเดียวที่ตัวเร่งปฏิกิริยารู้สึกดี แม้ว่าเป้าหมายจะดีและถ้ามันมาถึงจุดที่ดูเหมือนว่าจะไปข้างหน้า (เช่น Apple ก็ฆ่า AppKit) มันเป็นตัวเลือกอย่างแน่นอน
คุณไม่สามารถสรุปพฤติกรรมเฉพาะแพลตฟอร์มทั้งหมดได้ที่นี่ ...
ถูกต้อง! การควบคุม UI แต่ละตัวมีฟิลด์ objc ซึ่งคุณสามารถใช้เป็นฟักหลบหนี - หากการควบคุมไม่รองรับบางสิ่งคุณมีอิสระที่จะส่งไปยังรันไทม์ Objective -C ด้วยตัวเองและจัดการกับมัน
ทำไมคุณไม่ใช้การผูกเพื่อสร้างสิ่งนี้โดยอัตโนมัติ
สำหรับวัตถุประสงค์ในการสำรวจครั้งแรกฉันได้ทำสิ่งนี้ส่วนใหญ่ด้วยมือเพราะฉันต้องการหาวิธีที่เหมาะสมกับโมเดลสนิมก่อนที่จะมุ่งมั่นที่จะสร้างผลผูกพัน นี่คือสิ่งที่ฉันน่าจะมุ่งเน้นไปที่ต่อไปตอนนี้ที่ฉันมีสิ่ง "ทำงาน" ได้ดีพอ
สิ่งนี้เกี่ยวข้องกับโกโก้โครงการ Swift หรือไม่?
ไม่โครงการที่อ้างถึงในคำถามนี้มีวัตถุประสงค์เพื่อทำแผนที่บางส่วนของโกโก้และ Uikit เพื่อทำงานบน Linux แต่ไม่เคยเห็นกิจกรรมในบางครั้ง (มันเจ๋งจริง ๆ เช่นกัน!)
การตั้งชื่อโครงการโอเพ่นซอร์สในปี 2020 เป็นเหมือนการพยายามซื้อโดเมน .com : ทุกอย่างดี โชคดีที่หลายโครงการสามารถแบ่งปันชื่อ ... นั่นคือสิ่งที่จะเกิดขึ้นที่นี่
การโกงแบบจำลองวัตถุสนิมแบบนี้ไม่ใช่หรือ?
ขึ้นอยู่กับว่าคุณดูอย่างไร โดยส่วนตัวแล้วฉันไม่สนใจมากเกินไป - เลเยอร์ GUI สำหรับแพลตฟอร์มเหล่านี้เป็นข้อกำหนดที่ยากที่จะสนับสนุนผลิตภัณฑ์บางประเภทและการให้พวกเขายังหมายถึงการละทิ้งเครื่องมือที่ผ่านการทดสอบการต่อสู้สำหรับสิ่งต่าง ๆ เช่นการเข้าถึงและการรวมระบบปฏิบัติการที่ลึกซึ้งยิ่งขึ้น จากที่กล่าวมาภายในมีความพยายามที่จะลองและทำให้สิ่งต่าง ๆ เคารพรูปแบบของ Rust ว่าสิ่งต่าง ๆ ควรทำงานอย่างไร
คุณสามารถนึกถึงสิ่งนี้คล้ายกับ GTK-RS หากคุณต้องการสนับสนุนหรือลองใช้โมเดล ที่บริสุทธิ์ มากขึ้นไปดูดรูอิดหรืออะไรสักอย่าง -
คู่ที่ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT/MPL-2.0 ดูไฟล์ที่เหมาะสมในที่เก็บข้อมูลนี้สำหรับข้อมูลเพิ่มเติม Apple, Appkit, Uikit, Cocoa และเครื่องหมายการค้าอื่น ๆ คือ Copyright Apple, Inc.
คุณสามารถติดตามฉันบน Twitter หรือส่งอีเมลถึงฉันด้วยคำถามที่ไม่เหมาะสมเป็นปัญหาที่นี่